目录:网上冲浪指南

基于 Moq 的 IoC 容器 —— AutoMocker

2019/08/19

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

内容导航