模型注入正好是一个中间件在做,正好你关闭了中间件,所以模型注入失效了。具体哪个中间件你得找找。另外,你应该把测试类型区分清楚,laravel tests 目录下有两种测试,你看目录名称,在Feature目录下的叫做特性测试,在Unit目录下的才叫单元测试。两种测试的用途是不同的。
单元测试
旨在通过自己构造的数据来测试大到单个类,小到单个方法,以此来测试关键部分不出问题。这里的关键部分,通常指的是你自己写的代码,所以单元测试不会帮你构造容器什么的,也就是说单元测试是完全把框架和你的代码隔离开来测试的。
特性测试(功能测试/验收测试)
特性测试旨在将你的代码与框架的代码合到一起测试。也就是你问题中使用路由来做的测试。这种测试的特点是它的测试范围覆盖了从接受请求到返回响应,相当于把整个请求处理过程当作黑盒来测试。因为这个特性,我也喜欢叫它验收测试。表示验收的时候跑一遍,没问题就是没问题了。
总结
所以你在验收测试里面如无特殊应该开启所有需要使用的框架功能。
———–更新—————————–
我刚看了一下,模型注入的中间件是\Illuminate\Routing\Middleware\SubstituteBindings::class
然后我猜了一下你的场景,你可能是需要在测试中忽略特定的中间件。这里分两种情况。
自己写的中间件
文档中说CSRF这个中间件会在测试的时候自动无效化,我跟进去看了下,发现它是直接判断当前执行环境。如果是测试环境它就会略过检查。所以,如果你要忽略的中间件是自己写的,那你就要通过在中间件里面检查环境来决定是否执行中间件的逻辑。
框架的中间件
我大概看了下 App\Http\Kernel::class
和 Illuminate\Foundation\Http\Kernel::class
,发现没有什么好的方法来做这个事情,所以你可能需要像 App\Http\Kernel::class
里面一样,使用手动注释这种本办法来忽略你不想跑的中间件。
推荐文章: