有没有办法测试结合 TestServer 和 moq Mock 来替换 ConfigureTestServices 类中的方法?

Yah*_*hia 3 c# integration-testing unit-testing moq asp.net-core-mvc

我能够使用TestServer进行集成测试,并且我可以通过在ConfigureTestServices类中替换为模拟类来手动模拟任何 DI 注入类中的方法,如下所示:

var webHostBuilder =
    new WebHostBuilder()
        .UseEnvironment("Testing")
        .UseContentRoot(projectDir)
        .ConfigureTestServices(s =>
        {
            s.TryAddTransient(IMyClass, MyMockMyClass);
        })
        .UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)

哪里MyMockMyClass是 的替换MyClass,目的是替换方法(例如:)Method1

是否可以选择使用最小起订量Mock.Of<MyClass>快速替换 my Method1,而无需创建新类MyMockMyClass?就像是 :

var mymock = Mock.Of<IMyClass>();
Mock.Get(mymock ).Setup(m => m.Method1(It.IsAny<string>()).Returns(value: whatever);
Run Code Online (Sandbox Code Playgroud)

然后以某种方式使用这种mymock与线s.TryAddTransient(IMyClass, ...ConfigureTestServices上面的代码?

Nko*_*osi 5

在配置测试服务器时让工厂委托返回模拟的服务

var mymock = Mock.Of<IMyClass>();
Mock.Get(mymock)
    .Setup(m => m.Method1(It.IsAny<string>())
    .Returns(value: whatever);

var webHostBuilder =
    new WebHostBuilder()
        .UseEnvironment("Testing")
        .UseContentRoot(projectDir)
        .ConfigureTestServices(services => {
            services.RemoveAll<IMyClass>();//Remove previous registration(s) of this service
            services.TryAddTransient<IMyClass>(sp => mymock);
        })
        .UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)

如果每次调用都需要一个新的模拟实例,则将逻辑移到工厂委托中