2

在我的 100 多次测试中,我有以下一行:

var registry = new Mock<ObjectRegistry>(new List<Assembly>()).Object;

稍作重构将我的 ObjectRegistry 构造函数更改为:

public ObjectRegistry(AssemblyRegistry assemblies, UserPromt userPromt)

所以我必须更新我所有的 100 个测试用例来使用以下模拟:

var objectRegistry = new Mock<ObjectRegistry>(Mock.Of<AssemblyRegistry>(), Mock.Of<UserPromt>());

我想要的是所有依赖项都是模拟的,无论我需要什么依赖项都是不变的。

我可以告诉 Moq 以某种方式自动模拟它需要的所有依赖项吗?

在带有 Mockito 的 java 中,这根本不是问题......

4

2 回答 2

3

你在这里嘲笑一个具体的对象。Moq 与接口一起使用时效果最佳。尝试模拟角色,而不是对象(pdf)。例如,引入一个接口,如IObjectRegistry. 目前您的代码知道它正在处理一个 ObjectRegistry,理想情况下,您应该能够随时切换您的实现。只要你有一个抽象的地方。对于可测试性和编程最佳实践来说,“编程到接口”将是理想的选择。注意这里的接口不一定是指 C#/Java 等方面的接口。

var registry = new Mock<IObjectRegistry>();

public class ObjectRegistry : IObjectRegistry { // Snip }

然后用这个。由于这是一个接口,您可以随意更改具体(真实/生产)类及其构造函数。您的测试和系统的其余部分应该不知道。如果注册表在接口上有一个方法,例如GetObject您的系统应该简单地依赖这个抽象,而不是它正在使用ObjectRegistry实例的事实。

目前,您的代码实际上是在创建一个真实的实例ObjectRegistry,然后对有问题的方法进行存根/模拟。在大多数情况下,这并不理想。

于 2013-02-23T18:07:18.180 回答
1

您的问题的最佳实践是使用接口而不是具体类,并通过这些接口传递您的依赖关系。

public ObjectRegistry(IAssemblyRegistry assemblies, IUserPromt userPromt)

于 2013-02-24T09:52:01.363 回答