首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Laravel中测试接口的实现

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

Stack Overflow用户
提问于 2015-08-07 12:11:24
回答 1查看 1.3K关注 0票数 1

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

phpunit error when testing an implementation with injected dependencies

然而,我不知道我现在面临的问题是否是结构和设计问题,而不是编码问题。因此,我想在此提出一个更一般性的问题:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-07 13:15:28

没错--只要直接测试实现,如果可以的话,就可以完全绕过IoC容器。

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

在我看来,在测试期间,唯一可以依靠IoC容器解决问题的方法是,如果被解决的是您正在测试的事物的依赖关系,那么:

  • 它本身是经过充分测试的,所以您知道它是正确工作的。
  • 执行您希望在测试期间不发生的昂贵操作(例如第三方API操作或破坏性操作),在这种情况下,您应该模拟类/接口,并“假装”它完成了工作,然后返回您指定的内容(也有助于确保依赖组件的输入和输出,以便测试类对依赖项的响应*)。

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

*考虑使用“现在”日期(并且确定一个人的年龄,比如说),而不能够在测试期间指定使用什么作为“现在”日期--您必须在测试期间重新实现您的年龄计算代码,以便计算出年龄,以确保您编写的代码输出正确的年龄,这对实际测试您的代码几乎没有什么作用!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31877424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档