【问题标题】:Testing behaviour of classes with deep nested dependencies测试具有深层嵌套依赖关系的类的行为
【发布时间】:2015-03-09 08:09:33
【问题描述】:

我开始使用 Behat,我在想什么是做这样的事情的正确方法:

我正在使用 Behat(域,而不是 Web)测试系统行为,并且我想测试使用 UserService 类的行为。 UserService 将 UserRepository(接口)作为参数。我应该在上下文中创建 UserService 对象还是应该从某个依赖注入容器中获取它(我目前没有,因为我想先对域进行建模)?或者我应该创建一个工厂来构建用户服务?我应该模拟这些依赖项吗?

这里的问题是,UserRepository 可能有多个实现,我想测试系统使用的那个(因此从 DI 容器中获取 UserService)。在编写功能文件/上下文时,我不知道我将使用哪个实现。可能只是一些虚拟的 FilesystemUserRepository 只是为了通过测试。

如果我在上下文中使用 FilesystemUserRepository,那么在我决定在开发后期迁移到 DatabaseUserRepository 之后,我将不得不重写所有使用 UserService 类的上下文。

是否有一些最佳实践来做到这一点?

【问题讨论】:

    标签: php testing tdd bdd behat


    【解决方案1】:

    我通常从在上下文的构造函数中创建所有内容开始,因为这是一个我经常前后移动的阶段,我不想因为必须创建服务定义而分心。在这个阶段代码可能会发生很大的变化,所以无论如何它都会相当低效。

    稍后,我在应用程序的容器中创建服务定义。使用 Symfony 容器很容易inject those services directly into your context。另一个优点是,使用 Symfony 环境,您实际上可以替换测试环境中的一些服务。实际上我经常使用它,因为我更喜欢在验收测试中使用内存存储库,而不是基于数据库的存储库。

    在一些项目中我没有采取第二步,而是将所有的服务初始化都留在了 Behat 的上下文类中。效果也不错。

    【讨论】:

    • 这可能有点偏执,但如果我不想在开发早期创建与任何一个 DI 容器的耦合怎么办?另一方面,DI 容器是当今应用程序的基础,所以也许这并没有错……我现在可能只会坚持在上下文中实例化所有内容。
    • 这并不是真正的耦合,因为这样你就不会直接使用容器。 Symfony2 Behat 扩展负责注入服务。如果你决定切换到另一个容器,你需要一个 Behat 扩展来为你注入。上下文保持不变。
    • 很好,这正是我的想法。谢谢。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2020-05-15
    相关资源
    最近更新 更多