Laravel中 FeatureTest和 UnitTest的区别是什么

如题

刚接触编写测试代码,看教程写了一些FeatureTest

琢磨着再写一点UnitTest

发现FeatureTest里面使用的很多功能UnitTest里用不了

:tired_face::tired_face::tired_face:

最后才发现这俩继承的类不同

FeatureTest类继承了Tests\TestCase;
这个类初始化了Laravel容器,Test里面可以借助Laravel的函数写代码

UnitTest类继承了PHPUnit\Framework\TestCase;
这个类没有初始化Laravel容器,很多Laravel的功能是用不了的
我的代码全部都是Controller->Service->Repository->Model的分层结构写的
各个层里的类都依赖了很多上一层或者下一层的类

没有了依赖注入,我怎么去测试Service类的某一个函数?
或者说我对于UnitTest的理解是错的?
或者说我的编码逻辑有问题呢?

想问问大家都是怎么写的:smirk:

:persevere::persevere::persevere:
举个栗子吧
如果有一个Model类 MemberProduct
这个类写的时候就已经继承了 Illuminate\Database\Eloquent\Model类
不初始化Laravel,我想New一个这个类都不容易,更没有办法去写测试

如果有一个Service类 MemberService
这个类注入了MemberRepository类,MemberRepository类注入了Member类
不初始化Laravel,Member类我就New不了,初始化MemberService类都困难,怎么才能写测试呢?

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
fatrbaby

一个是单元测试,一个是集成测试后。单元测试侧重于测你写的类,集成测试侧重于测试业务、接口等。

2年前 评论

file 注意看再laravel的框架下的tests目录,tesstcase.php 里面有个 use CreatesApplication;

这里面已经调用laravel的控制台Kernel,所以应该不存在不能用的情况 。


trait CreatesApplication
{
    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();

        Hash::setRounds(4);

        return $app;
    }
}

laravel的ioc的c是容器的意思,所以你要用的服务在laravel中是统一放在同一个地方的,如果你要手动取出来你应该这样写,加上注释可以使得ide可以识别你取出来的服务是那个对象。框架集成phpunit,这么多年了,肯定支持你测试的。

/* @var $server xxxxx */
$server = app(xxxx::class);
2年前 评论

file 这是前几天新业务中写的一个单元测试的代码,service和 Repository 同理

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!