【问题标题】:Need some guidance on testing strategies for Laravel 4 application需要一些有关 Laravel 4 应用程序测试策略的指导
【发布时间】:2015-01-16 15:10:19
【问题描述】:

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

【问题讨论】:

  • 回答你的第二个要点,编写测试的主要原则是“只测试你自己的东西”,我们的意思是,我们将假设所有 laravel 函数实际上都正常工作(不管是对是错),所以你的测试只需要确保结果的数量是正确的。
  • 好的,这是有道理的——为了正确地进行单元测试,我假设我不应该访问数据库,所以我想我需要模拟 ShippingRun 和 Paginate 对象,并告诉他们返回特定数据?我想我现在的问题是,我什至在测试什么?这个功能完全依赖于 Laravel 类,所以如果我模拟它们以返回特定的数据,那么测试实现了什么?我觉得我误解了一个关键的想法。

标签: php unit-testing testing laravel


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多