需要一些关于Laravel 4应用程序测试策略的指导

时间:2015-01-16 15:10:20

标签: php unit-testing testing laravel

我已经编写了一个相当简单的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编写的应用程序的源代码,这些应用程序编写了一些很好的测试,通过在真实情况下查看代码,我学到了很多东西。有谁知道我会在哪里找到它?

1 个答案:

答案 0 :(得分:1)

  

我假设我需要以某种方式模拟依赖项(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