C# xUnit的模拟服务

C# xUnit的模拟服务,c#,asp.net-core,integration-testing,xunit,C#,Asp.net Core,Integration Testing,Xunit,我有一个目前按设计工作的应用程序,但在扩展它之前,我正在尝试使用xUnit设置集成测试。目前,测试将只在执行测试时使用原始服务,我不明白为什么 这就是测试: 使用istorepository=Repositories.V3.Interfaces.istorepository; 公共类存储测试:IClassFixture{ 私有只读ITestOutputHelper\u输出; 私有只读WebApplicationFactory\u工厂; 私有只读字符串\u url; 公共存储测试(ITestOut

我有一个目前按设计工作的应用程序,但在扩展它之前,我正在尝试使用xUnit设置集成测试。目前,测试将只在执行测试时使用原始服务,我不明白为什么

这就是测试:

使用istorepository=Repositories.V3.Interfaces.istorepository;
公共类存储测试:IClassFixture{
私有只读ITestOutputHelper\u输出;
私有只读WebApplicationFactory\u工厂;
私有只读字符串\u url;
公共存储测试(ITestOutputHelper输出,WebApplicationFactory){
_输出=输出;
_工厂=工厂;
_url=“/api/store”;
}
[理论]
[InlineData(“获取”、“伪造123”)]
公共异步任务StoreByCode(字符串方法,字符串代码=null){
//var client=_factory.CreateClient();
var client=\u factory.WithWebHostBuilder(builder=>{
builder.ConfigureTestServices(服务=>{
services.addScope();
});
}).CreateClient();
var request=newhttprequestmessage(newhttpmethod(method),$“{u url}/{code}”);
字符串readAsStringAsync;
_WriteLine($“请求Uri:{Request.RequestUri}”);
使用(var-response=await-client.sendsync(请求)){
response.EnsureSuccessStatusCode();
readAsStringAsync=wait response.Content.readAsStringAsync();
如果(!response.issucessStatusCode){
_output.WriteLine($”未成功({response.StatusCode}):{readAsStringAsync}”);
}
}
var stores=JsonConvert.DeserializeObject(readAsStringAsync);
Assert.True(stores.Any());
}
}
但是,当我在真正的
存储库
中执行测试时,在Startup.cs中注册的
StoreRepository
是命中的断点,而不是
StoreRepositoryTest
中的断点。我将工厂设置为覆盖依赖项,但它忽略了它。我能做些什么来纠正这个问题

作为参考,我一直在使用以下来源:

更新 我不确定这个问题是否应该删除,但它最终是一个非常愚蠢的错误。我更新了上面的代码以包含一个using别名。原来我是在注册和覆盖V1接口,而不是V3。当我实现模拟类时,我没有意识到我正在实现旧的服务。好消息是,上面的代码是一个如何使用Microsoft文档进行模拟的工作示例。

1)您可以尝试使用CustomWebApplicationFactory类,并在ConfigureWebHost(IWebHostBuilder builder)方法中添加builder.ConfigureServices(//定义依赖项)。


2) 或者,您可以定义自己的TestStartup类继承自Startup类并使用它。

我以前见过这个。您可能在不同的命名空间中创建了一个接口

通常,当您有web服务的版本1接口,然后决定添加新功能时,就会发生这种情况。然后创建一个具有完全相同名称的Version2接口


services.AddScoped()
上设置一个断点,并对其进行调试。检查结果并滚动至添加服务的底部;您将清楚地看到正在添加的内容

如何准确地运行测试?请尝试使用
builder.ConfigureServices
,看看它是否有帮助。注意到这个问题出现了上升,而文档确实说要按您所显示的去做。@VladimirSerykh我正在使用Visual Studio 2019的测试资源管理器来运行测试,我专门使用调试功能来验证代码路径。@Nkosi通过我的失败,我了解了一点这是如何工作的。当我调试和单步执行代码时,我发现ConfigureServices是过程中的第一步,ConfigureTestServices随后发生。您希望使用前者,以便在之后注册您的模拟服务。我想微软的DI库是最后一个条目。您可以看到,原始服务和模拟服务都是针对同一接口注册的。我不能代表其他人说话,但我的案例最终是由于将注册与同名的不同服务(V1与V3)混淆而导致的。正是这一点。我一直在努力更新API并整合它们,但为了向后兼容,我不想删除它的旧版本。我“覆盖”了V1,却没有意识到这一点。我太专注于这个例子了,以至于我没有考虑注册哪个接口。我将更新我的问题,使其包含一个使用别名,并对其进行更新。