【问题标题】:How to test implementations of interfaces in Laravel如何在 Laravel 中测试接口的实现
【发布时间】:2015-08-07 12:11:24
【问题描述】:

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

phpunit error when testing an implementation with injected dependencies

但是,我想知道我遇到的问题是结构和设计问题,而不是编码问题。因此,我想在这里问一个更笼统的问题:

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

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

【问题讨论】:

    标签: unit-testing laravel interface phpunit


    【解决方案1】:

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

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

    在我看来,在测试期间您唯一可以依靠 IoC 容器来解决问题的情况是,解决的问题是您正在测试的东西的依赖关系,或者:

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

    即便如此,您也可以手动注入依赖项以确保代码环境一致。 IoC 容器只是有助于深入创建任何依赖项,而无需在测试中担心所有这些。


    *考虑测试使用“现在”日期(例如,确定一个人的年龄)而无法在测试期间指定使用什么作为“现在”日期的东西 - 你必须重新实现你的测试期间的年龄计算代码只是为了计算年龄,以确保您编写的代码输出正确的年龄,这对实际测试您的代码几乎没有作用!

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多