Moq.AutoMocker 是一款基于 Moq 实现的 IoC 容器,它可以用来全自动的使用 Moq 来创建待测试的服务的依赖。
在使用 AutoMocker 之前,我在测试一个依赖比较复杂的类的时候,往往会使用下面的模式来创建 Mock:
public class BlogPostValidatorDepsMock
{
public Mock<IBlogPostQuery> BlogPostQuery { get; } = new Mock<IBlogPostQuery>();
// many mocks
public ClockTimeProvider Clock { get; set; } = new ClockTimeProvider();
public BlogPostValidator MakeInstance()
{
return new BlogPostValidator(BlogPostQuery.Object, Clock, ...ManyMocks.Object);
}
}
可以看到,当待测试的类的依赖变得复杂的时候,设立 Mock 也会变得非常的冗余,而 AutoMocker 则可以使用依赖注入的方式来帮助我们简化这部分工作:
var mocker = new AutoMocker();
var service = mocker.CreateInstance<BlogPostValidator>();
var queryMock = mocker.GetMock<IBlogPostQuery>();
await service.DoSomethingAsync();
queryMock.Verify(x => x.QuerySomeThingAsync(), Times.Once);
除了让 AutoMocker 自动为我们生成 Mock 依赖之外,我们还可以手动指定某个服务的实现:
mocker.Use(typeof(ISystemTimeProvider), new ClockTimeProvider());
更多说明参见:Moq.AutoMocker