【问题标题】:Error on Inherit Startup in ASP.NET Core 2.1 Functional TestsASP.NET Core 2.1 功能测试中的继承启动错误
【发布时间】:2018-09-03 03:42:50
【问题描述】:

我在 ASP.NET Core 2.1 和 xUnit 中创建了一个项目功能测试。我有一个函数CreateServer() 是这样的:

public TestServer CreateServer()
{
    var path = Assembly.GetAssembly(typeof(TScenarioBase))
        .Location;
    var hostBuilder = new WebHostBuilder()
        .UseContentRoot(Path.GetDirectoryName(path))
        .UseStartup<IntergrationTestStartup>();

     return new TestServer(hostBuilder);
}

我的班级IntergrationTestStartup 是这样的:

public class IntergrationTestStartup: Startup
{
    public IntergrationTestStartup(IConfiguration configuration) : base(configuration)
    {

    }
}

IntergrationTestStartup 继承自主项目的 Startup 类。 但是我在执行任何测试用例时都找不到 404。当我将 IntergrationTestStartup 替换为 Startup 时,它按预期工作,但我无法为测试环境自定义 Startup 类。

请帮助我在功能测试环境中使用类 IntergrationTestStartup

谢谢,

【问题讨论】:

标签: c# functional-testing asp.net-core-2.1


【解决方案1】:

我遇到了同样的问题。在测试执行期间,我需要使用 DocumentRepositoryMock 服务而不是 DocumentRepositoryApiProxy。 Startup类的注册是:

serviceCollection.AddScoped<IDocumentService, DocumentRepositoryApiProxy>();

我的测试代码是:

[TestInitialize]
public virtual void TestInitialize()
{
    ...
    ...

    this.Configuration = new ConfigurationBuilder()
        .SetBasePath(AppContext.BaseDirectory)
        .AddJsonFile("appsettings.json")
        .Build();

    var host = new WebHostBuilder()
        .UseContentRoot(AppContext.BaseDirectory)
        .UseConfiguration(this.Configuration)
        .UseEnvironment(Extensions.HostingEnvironmentExtensions.IntegrationTest)
        .UseStartup<TestStartup>();

        this.Server = new TestServer(host);
        this.HttpClient = this.Server.CreateClient();

我的 TestStartup 类继承自 Startup 并覆盖我根据 TEST 执行进行不同服务注册的方法:

serviceCollection.AddScoped<IDocumentService, DocumentRepositoryMock>();

但是,我的测试中使用的 HttpClient 返回 404。

我找到了这个解决方案:

    var host = new WebHostBuilder()
        .UseContentRoot(AppContext.BaseDirectory)
        .UseConfiguration(this.Configuration)
        .UseEnvironment(Extensions.HostingEnvironmentExtensions.IntegrationTest)
        .UseStartup<TestStartup>();

        host.ConfigureTestServices(services =>
        {
            services.AddScoped<IDocumentService, DocumentRepositoryMock>();
        });

使用 ConfigureTestServices 我可以注册我的 Mock 服务并将其注入我的消费者类中,无需扩展我的 Startup 类

无论如何,如果您可以为您的测试添加第二个注册 services.AddScoped(),这将起作用。事实上,同一个接口有两个注册,IoC 会给你最后一个注册的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 2019-02-20
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多