首页 > 解决方案 > 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());
    }
}

但是,当我进行测试时RepositoryStoreRepository在 Startup.cs 中注册的实际断点是被击中的断点,而不是StoreRepositoryTest. 我设置我的工厂来覆盖依赖,但它忽略了它。我能做些什么来纠正这个问题。

作为参考,我一直在使用这个来源:https ://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2

更新

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

标签: c#asp.net-coreintegration-testingxunit

解决方案


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

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

设置一个断点services.AddScoped<IStoreRepository, StoreRepositoryTest>()并进行调试。检查结果并滚动到添加服务的底部;您将清楚地了解正在添加的内容。


推荐阅读