xUnit 的模拟服务
Mock service for xUnit
我有一个当前按设计工作的应用程序,但我在扩展它之前尝试使用 xUnit 设置集成测试。目前测试只会在执行测试时使用原始服务,我不明白为什么。
这是测试:
using IStoreRepository = Repositories.V3.Interfaces.IStoreRepository;
public class StoreTests : IClassFixture<WebApplicationFactory<Startup>> {
private readonly ITestOutputHelper _output;
private readonly WebApplicationFactory<Startup> _factory;
private readonly string _url;
public StoreTests(ITestOutputHelper output, WebApplicationFactory<Startup> factory) {
_output = output;
_factory = factory;
_url = "/api/store";
}
[Theory]
[InlineData("GET", "FAKE123")]
public async Task StoreByCode(string method, string code = null) {
// var client = _factory.CreateClient();
var client = _factory.WithWebHostBuilder(builder => {
builder.ConfigureTestServices(services => {
services.AddScoped<IStoreRepository, StoreRepositoryTest>();
});
}).CreateClient();
var request = new HttpRequestMessage(new HttpMethod(method), $"{_url}/{code}");
string readAsStringAsync;
_output.WriteLine($"Request Uri: {request.RequestUri}");
using (var response = await client.SendAsync(request)) {
response.EnsureSuccessStatusCode();
readAsStringAsync = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode) {
_output.WriteLine($"Not successful ({response.StatusCode}): {readAsStringAsync}");
}
}
var stores = JsonConvert.DeserializeObject<List<Store>>(readAsStringAsync);
Assert.True(stores.Any());
}
}
但是当我进行测试时,真正的Repository
中的断点,Startup.cs中注册的StoreRepository
是被击中的断点,而不是[中的断点=13=]。我将我的工厂设置为覆盖依赖项,但它忽略了它。我该怎么做才能纠正这个问题。
作为参考,我一直在使用这个来源:https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2
更新
不确定是否应该删除这个问题,但它最终变成了一个非常愚蠢的错误。我更新了上面的代码以包含一个 using 别名。结果我注册并覆盖了 V1 接口而不是 V3。当我实现 Mock class 时,我没有意识到我正在实现旧服务。所以好消息是上面的代码是如何使用 Microsoft 文档进行模拟的工作示例。
1) 您可以尝试使用 CustomWebApplicationFactory class 并在 ConfigureWebHost(IWebHostBuilder builder) 方法中添加 builder.ConfigureServices(//define dependencies)。
Refer msdn link
2) 或者,您可以定义自己的 TestStartup class 继承自 Startup class 并使用它。
我以前看过这个。您可能在不同的命名空间中创建了一个接口。
通常,当您拥有 Web 服务的第 1 版界面,然后您决定添加新功能时,就会发生这种情况。然后您创建一个名称完全相同的版本 2 接口。
在 services.AddScoped<IStoreRepository, StoreRepositoryTest>()
上放置一个断点并调试它。检查结果并滚动到添加服务的底部;您将清楚地了解正在添加的内容。
我有一个当前按设计工作的应用程序,但我在扩展它之前尝试使用 xUnit 设置集成测试。目前测试只会在执行测试时使用原始服务,我不明白为什么。
这是测试:
using IStoreRepository = Repositories.V3.Interfaces.IStoreRepository;
public class StoreTests : IClassFixture<WebApplicationFactory<Startup>> {
private readonly ITestOutputHelper _output;
private readonly WebApplicationFactory<Startup> _factory;
private readonly string _url;
public StoreTests(ITestOutputHelper output, WebApplicationFactory<Startup> factory) {
_output = output;
_factory = factory;
_url = "/api/store";
}
[Theory]
[InlineData("GET", "FAKE123")]
public async Task StoreByCode(string method, string code = null) {
// var client = _factory.CreateClient();
var client = _factory.WithWebHostBuilder(builder => {
builder.ConfigureTestServices(services => {
services.AddScoped<IStoreRepository, StoreRepositoryTest>();
});
}).CreateClient();
var request = new HttpRequestMessage(new HttpMethod(method), $"{_url}/{code}");
string readAsStringAsync;
_output.WriteLine($"Request Uri: {request.RequestUri}");
using (var response = await client.SendAsync(request)) {
response.EnsureSuccessStatusCode();
readAsStringAsync = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode) {
_output.WriteLine($"Not successful ({response.StatusCode}): {readAsStringAsync}");
}
}
var stores = JsonConvert.DeserializeObject<List<Store>>(readAsStringAsync);
Assert.True(stores.Any());
}
}
但是当我进行测试时,真正的Repository
中的断点,Startup.cs中注册的StoreRepository
是被击中的断点,而不是[中的断点=13=]。我将我的工厂设置为覆盖依赖项,但它忽略了它。我该怎么做才能纠正这个问题。
作为参考,我一直在使用这个来源:https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2
更新
不确定是否应该删除这个问题,但它最终变成了一个非常愚蠢的错误。我更新了上面的代码以包含一个 using 别名。结果我注册并覆盖了 V1 接口而不是 V3。当我实现 Mock class 时,我没有意识到我正在实现旧服务。所以好消息是上面的代码是如何使用 Microsoft 文档进行模拟的工作示例。
1) 您可以尝试使用 CustomWebApplicationFactory class 并在 ConfigureWebHost(IWebHostBuilder builder) 方法中添加 builder.ConfigureServices(//define dependencies)。 Refer msdn link
2) 或者,您可以定义自己的 TestStartup class 继承自 Startup class 并使用它。
我以前看过这个。您可能在不同的命名空间中创建了一个接口。
通常,当您拥有 Web 服务的第 1 版界面,然后您决定添加新功能时,就会发生这种情况。然后您创建一个名称完全相同的版本 2 接口。
在 services.AddScoped<IStoreRepository, StoreRepositoryTest>()
上放置一个断点并调试它。检查结果并滚动到添加服务的底部;您将清楚地了解正在添加的内容。