测试具有深层嵌套依赖项的 类 的行为
Testing behaviour of classes with deep nested dependencies
我开始使用 Behat,我在想做这样的事情的正确方法是什么:
我正在使用 Behat(域,而不是 Web)测试系统行为,我想测试使用 UserService class 的行为。 UserService 将 UserRepository(接口)作为参数。我应该在上下文中创建 UserService 对象还是应该从某个依赖项注入容器中获取它(我目前没有,因为我想先对域建模)?或者我应该创建一个工厂来构建 UserService?我应该模拟那些依赖关系吗?
这里的问题是,可能有 UserRepository 的多个实现,我想测试系统使用的那个(因此从 DI 容器中获取 UserService)。我不知道在编写功能时我将使用哪个实现 file/context。可能只是一些虚拟的 FilesystemUserRepository 只是为了通过测试。
如果我在上下文中使用了 FilesystemUserRepository,那么在我决定在开发后期移动到 DatabaseUserRepository 之后,我将不得不重写所有使用 UserService 的上下文 class。
是否有一些最佳实践如何做到这一点?
我通常从在我的上下文的构造函数中创建所有内容开始,因为这是一个我经常来回移动的阶段,我不想因为必须创建服务定义而分心。在这个阶段代码可能会发生很大的变化,所以无论如何都会很低效。
稍后,我在应用程序的容器中创建服务定义。使用 Symfony 容器很容易inject those services directly into your context。另一个优点是,使用 Symfony 环境,您实际上可以替换测试环境中的一些服务。我实际上经常使用它,因为我更喜欢在验收测试中使用内存存储库,而不是基于数据库的存储库。
在某些项目中我没有进行第二步,而是将所有服务初始化留在了 Behat 的上下文中 class。效果也不错。
我开始使用 Behat,我在想做这样的事情的正确方法是什么:
我正在使用 Behat(域,而不是 Web)测试系统行为,我想测试使用 UserService class 的行为。 UserService 将 UserRepository(接口)作为参数。我应该在上下文中创建 UserService 对象还是应该从某个依赖项注入容器中获取它(我目前没有,因为我想先对域建模)?或者我应该创建一个工厂来构建 UserService?我应该模拟那些依赖关系吗?
这里的问题是,可能有 UserRepository 的多个实现,我想测试系统使用的那个(因此从 DI 容器中获取 UserService)。我不知道在编写功能时我将使用哪个实现 file/context。可能只是一些虚拟的 FilesystemUserRepository 只是为了通过测试。
如果我在上下文中使用了 FilesystemUserRepository,那么在我决定在开发后期移动到 DatabaseUserRepository 之后,我将不得不重写所有使用 UserService 的上下文 class。
是否有一些最佳实践如何做到这一点?
我通常从在我的上下文的构造函数中创建所有内容开始,因为这是一个我经常来回移动的阶段,我不想因为必须创建服务定义而分心。在这个阶段代码可能会发生很大的变化,所以无论如何都会很低效。
稍后,我在应用程序的容器中创建服务定义。使用 Symfony 容器很容易inject those services directly into your context。另一个优点是,使用 Symfony 环境,您实际上可以替换测试环境中的一些服务。我实际上经常使用它,因为我更喜欢在验收测试中使用内存存储库,而不是基于数据库的存储库。
在某些项目中我没有进行第二步,而是将所有服务初始化留在了 Behat 的上下文中 class。效果也不错。