tdd - 单元测试、模拟对象和 ioc 的最佳实践

标签 tdd inversion-of-control mocking

好的,所以我最近一直在尝试进入 IoC。然而,我一直遇到一个障碍——这就是我喜欢使用模拟对象的事实。

它们可以快速轻松地设置。

但是,如果我在代码中到处使用 IoC,那么它会迫使我创建对象的测试实现(和配置),而不是使用模拟对象(即使用 moq)。

最终结果是我最终得到了大量用于测试的配置文件。

此外,在许多测试场景中,我需要在测试到测试的基础上从我的类(class)中获得不同的行为。使用 moq 对象,这非常容易。你会如何用 IoC 做类似的事情?

任何帮助将非常感激。

谢谢,
麦克风

最佳答案

IoC 应该使使用模拟对象更容易,而不是更难。

几个 IoC 容器框架将允许您定义要注入(inject)的预先存在的对象;与 Moq您只需为 myMockObject.Object 设置它。

编辑:配置示例 Unity用一个模拟:

var mockService = new Mock<IMyService>();
container.RegisterInstance<IMyService>(mockService.Object);

作为替代方案,您可以将模拟对象传递给被测类的构造函数(用于构造函数注入(inject)),并在单元测试中完全绕过 IoC 容器。

编辑:乔希的回答是替代方案的一个很好的例子。我通常会采用他的解决方案,而不是重新配置容器。

关于tdd - 单元测试、模拟对象和 ioc 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698245/

相关文章:

ios - TDD:单元测试异步调用

design-patterns - 构 build 计良好的依赖关系的注意事项

java - 如何使用 JUnit/Mockito 模拟一个值来测试另一个方法中的条件?

c# - Moq It.Is<> 不匹配

python-3.x - 如何模拟elasticsearch.helpers.bulk

ruby - 有没有与Ruby-land的Bundler等人等效的Haskell-land。 al,如果没有,那么如何设计一个结构如此的项目?

ruby-on-rails - 未定义的方法`use_transactional_fixtures

具有多个断言的 Clojure 测试

c# - 数据访问层的静态方法与依赖注入(inject)

.net - 从 ninject 获取所有具体类型