如何在Laravel中测试接口的实现

时间:2015-08-07 12:11:24

标签: unit-testing laravel interface phpunit

我在这里问了一个具体问题:

phpunit error when testing an implementation with injected dependencies

然而,我想知道我遇到的问题是结构和设计而不是编码。因此,我想在这里提出一个更通用的问题:

我正在使用Laravel,我编写了一个接口,然后是一个支持它的类。然后我使用服务提供程序将接口绑定到实现类,并注入恰好是Eloquent模型的所需依赖项。

我的问题是:我该如何测试这门课?目前我正在调用接口上的方法。因此,这会调用服务提供者来解析实现(而不是接口)并为我注入一个模型(需要在工厂构建或模拟)。这感觉我测试太多(测试服务提供商和模型,甚至在触及我的目标方法之前)。我应该直接测试实现吗?

1 个答案:

答案 0 :(得分:1)

确切地说 - 如果可以的话,直接测试实现并完全绕过IoC容器。

这样考虑一下 - 你编写一个接口部分,以便你可以交换功能(比如说PostgreSQl驱动程序的MySQL数据库驱动程序)。因此,必须测试类的每个单独实现。您不应该依赖IoC容器绑定来测试给定的实现,因为它非常依赖于配置。

正如我所看到的那样,在测试过程中唯一可以依赖IoC容器来解决问题的方法是,解决问题的方法是依赖于您正在测试的东西:

  • 本身已经过全面测试,因此您知道它可以正常工作
  • 执行昂贵的操作,您希望在测试期间不会发生这种操作(例如第三方API操作或破坏性的事情),在这种情况下,您应该模拟类/接口并且假装'它完成了工作然后返回你指定的东西(也有助于保证依赖组件的输入和输出,这样你就可以测试类对依赖的响应*)

即使这样,您也可以手动注入依赖项以确保一致的代码环境。 IoC容器只是帮助深入创建任何依赖项,而不必担心测试中的所有依赖项。

*考虑测试一些使用现在'的东西。日期(并确定一个人的年龄,比如说),在测试过程中无法指定使用什么作为现在的'日期 - 您必须在测试期间重新实现您的年龄计算代码,以确定年龄,以确保您编写的代码输出正确的年龄,这对实际测试您的代码几乎没有作用!