我在这里问了一个具体问题:
phpunit error when testing an implementation with injected dependencies
然而,我想知道我遇到的问题是结构和设计而不是编码。因此,我想在这里提出一个更通用的问题:
我正在使用Laravel,我编写了一个接口,然后是一个支持它的类。然后我使用服务提供程序将接口绑定到实现类,并注入恰好是Eloquent模型的所需依赖项。
我的问题是:我该如何测试这门课?目前我正在调用接口上的方法。因此,这会调用服务提供者来解析实现(而不是接口)并为我注入一个模型(需要在工厂构建或模拟)。这感觉我测试太多(测试服务提供商和模型,甚至在触及我的目标方法之前)。我应该直接测试实现吗?
答案 0 :(得分:1)
确切地说 - 如果可以的话,直接测试实现并完全绕过IoC容器。
这样考虑一下 - 你编写一个接口部分,以便你可以交换功能(比如说PostgreSQl驱动程序的MySQL数据库驱动程序)。因此,必须测试类的每个单独实现。您不应该依赖IoC容器绑定来测试给定的实现,因为它非常依赖于配置。
正如我所看到的那样,在测试过程中唯一可以依赖IoC容器来解决问题的方法是,解决问题的方法是依赖于您正在测试的东西:
即使这样,您也可以手动注入依赖项以确保一致的代码环境。 IoC容器只是帮助深入创建任何依赖项,而不必担心测试中的所有依赖项。
*考虑测试一些使用现在'的东西。日期(并确定一个人的年龄,比如说),在测试过程中无法指定使用什么作为现在的'日期 - 您必须在测试期间重新实现您的年龄计算代码,以确定年龄,以确保您编写的代码输出正确的年龄,这对实际测试您的代码几乎没有作用!