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>() 上放置一个断点并调试它。检查结果并滚动到添加服务的底部;您将清楚地了解正在添加的内容。