单元测试Startup.cs

时间:2019-07-23 13:51:35

标签: unit-testing asp.net-core startup

尝试使用Startup.cs文件进行单元测试时遇到一些问题。我不知道没有集成测试该怎么做。有什么办法吗?我将这部分代码保留在单元测试中。我正在使用xUnit

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }

1 个答案:

答案 0 :(得分:0)

您应该隔离要测试的功能。

例如,如果您使用诸如伪代码之类的特殊配置,则可以先将其拆分以对其进行测试:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.AddFoo();
}

public void AddFoo(this IApplicationBuilder app)
{
    //stuff happens here
    //and you can test this.
}

有时候很难,因为它们大多数是扩展方法。但是通常,如果正在调用特定功能,则可以Verify

如果您拥有.net Peek之类的工具,则可以实际看到正在调用的非扩展方法,并验证该方法。

如果您要对整个startup.cs进行“单元”测试,这将很困难,因为实际配置已在其中。


如果您真的想测试整个流程,则必须提供设置以能够应付测试运行。您可以创建一个自定义的webbuilder并使用实际的客户端调用它,但是它将花费一些额外的if / else语句,而且它不会很漂亮。我们使用startup.cs并具有一些虚函数,因此我们可以重载棘手的部分,并为它提供一个自定义实现以用于测试。要创建这样的设置,可以使用以下示例:

private TestServer InitTestServer(HttpClient mockedHttpClient)
{
    var builder = new WebHostBuilder()
        .UseContentRoot(newBasePath)
        .UseEnvironment("UnitTest")
        .UseConfiguration(Configuration)
        .UseStartup<Startup>()
        .ConfigureTestServices((services) =>
        {
            services.AddSingleton<IHttpClientFactory>(new CustomHttpClientFactory(mockedHttpClient));

            //some configuration override
        });

    return new TestServer(builder);
}