我写了一个相当简单的Laravel应用程序(一个与AngularJS前端对话的REST API),但是我在如何测试它时遇到了一些麻烦。我以前从未做过任何真正的测试,在阅读了单元测试、TDD 等之后,我觉得我对它背后的广泛策略有很好的了解,但我只是在代码上实际实现它时遇到了麻烦。
我从单元测试开始,这是我想测试的类:
class ShippingRunRepository
{
public function getActiveRuns()
{
$runs = ShippingRun::with(['carrierAccount', 'carrierAccount.carrier', 'carrierAccount.carrier.carrierSteps'])
->where('accountID', '=', 'Auth::user()->accountID)
->where('active', '=', 1)
->get()
->filter(function ($run) {
if ($run->carrierAccount && $run->carrierAccount->carrier && $run->carrierAccount->carrier->carrierSteps) {
foreach ($run->carrierAccount->carrier->carrierSteps as $step) {
if ($step->shippingStep->stepCode == 'printLabelsApp') {
return $run;
}
}
}
});
return Paginator::make($runs->all(), $runs->count(), 15);
}
}
所以这是我对此的想法,如果你能让我知道我是否走在正确的轨道上,那就太好了:
- 我假设我需要以某种方式模拟依赖项(ShippingRun,Auth,Paginator) - 我试图将它们注入构造函数中,但遇到了一些问题,但如果这是正确的方法,我显然会再试一次
- 我是否需要进一步重构此代码,并单独测试每个函数?我也不确定该怎么做。
- 我已经看到一些针对此类的测试,这些测试测试Eloquent 对象本身是否接收某些调用(where、get 等) - 这是否违反了测试此类调用实现的规则,而不是功能?
你能给出的任何建议都会很棒!我也想看到用Laravel编写的应用程序的源代码,该应用程序编写了一些很好的测试,通过在真实情况下查看代码,我学到得更好。有谁知道我在哪里可以找到它?
我假设我需要以某种方式模拟依赖项(ShippingRun,Auth,Paginator)
您应该在构造函数中注入 ShippingRun 对象。这就是让你在测试中嘲笑它的原因。
Auth 和 Paginator 是成熟的 Laravel 外墙,可以这样嘲笑:http://laravel.com/docs/4.2/testing#mocking-facades
我已经看到了像这样的类的一些测试,这些测试测试了 Eloquent 对象本身是否接收某些调用(where、get 等) - 这是否违反了测试实现的规则
你走在正确的轨道上。假设 ShippingRun 是一个 Eloquent 模型,你可以模拟它并为它的方法编写 shouldReceive()->times()->with() 期望。你最终要测试的是ShippingRun正在接收正确的数据,并且getActiveRuns正在返回对Paginator外观的调用。你不需要关心其余的。
话虽如此,如果您更关心集成测试而不是单元测试,那么让您的 Eloquent 模型在测试中接收调用是可行的。它仍然会确保你的代码正常工作,但它会让你的测试与Eloquent紧密结合。如果你最终想摆脱纯粹的Laravel代码,这是一个最终的问题。
有谁知道我在哪里可以找到它?
https://laracasts.com/index/testing