测试具有深层嵌套依赖性的类的行为

时间:2015-03-09 08:09:33

标签: php testing tdd bdd behat

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

我正在使用Behat(域,而不是web)测试系统行为,我想测试使用UserService类的行为。 UserService将UserRepository(Interface)作为参数。我应该在上下文中创建UserService对象,还是应该从某个依赖注入容器中获取它(我现在不想要首先为域建模)?或者我应该创建一个工厂来构建UserService?我应该嘲笑那些依赖吗?

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

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

有一些最佳做法如何做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

在某些项目中,我没有采取第二步,并将所有服务初始化留在Behat的上下文类中。它也运作良好。