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

Unit testing 如何在Laravel中测试接口的实现,unit-testing,laravel,interface,phpunit,Unit Testing,Laravel,Interface,Phpunit,我在这里提出了一个具体问题: 然而,我想知道我遇到的问题是否是结构和设计问题,而不是编码问题。因此,我想问一个更一般的问题: 我正在使用Laravel,我已经编写了一个接口,然后是一个支持它的类。然后,我使用服务提供者将接口绑定到实现类,并注入所需的依赖项,这恰好是一个有说服力的模型 我的问题是:我应该如何测试这个类?目前我正在调用接口上的一个方法。因此,这将调用服务提供者来解析实现(而不是接口),并为我注入一个模型(需要工厂构建或模拟)。这感觉我测试太多了(测试服务提供商和模型,甚至在触及我

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

然而,我想知道我遇到的问题是否是结构和设计问题,而不是编码问题。因此,我想问一个更一般的问题:

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


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

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

这样想吧——您可以部分地对接口进行编码,这样就可以交换功能(比如说,MySQL数据库驱动程序用于PostgreSQl驱动程序)。因此,必须测试类的每个单独实现。您不应该依赖IoC容器绑定来测试给定的实现,因为它完全依赖于配置

在我看来,在测试过程中,您唯一可以依靠IoC容器解决问题的时间是,如果解决的问题是您正在测试的问题的依赖项,并且:

  • 它本身经过充分测试,因此您知道它工作正常
  • 执行您不希望在测试期间发生的昂贵操作(例如,第三方API操作或破坏性操作),在这种情况下,您应该模拟类/接口并“假装”它完成了工作,然后返回您指定的内容(也有助于保证依赖组件的输入和输出,以便您可以测试类对依赖项*的响应)
即使这样,您也可以手动注入依赖项以确保代码环境的一致性。IoC容器只是帮助您深入创建任何依赖项,而不必在测试中担心所有这些


*考虑一下测试使用“现在”日期的东西(比如,确定一个人的年龄)在测试过程中,如果不能指定使用什么作为“现在”日期,您就必须在测试过程中重新实现年龄计算代码,以便计算出年龄,以确保您编写的代码输出正确的年龄,这对实际测试您的代码几乎没有什么作用