簡體   English   中英

.net核心rc2非平凡集成測試不起作用

[英].net core rc2 non trivial integration testing does not work

以下代碼按預期工作,與asp站點上的示例非常相似:

public abstract class BaseResourceTests : IDisposable
{
    private readonly TestServer _server;

    public HttpClient HttpClient { get; }

    protected BaseResourceTests(string resourceVersion)
    {
        var hostBulider = new WebHostBuilder()
            .UseStartup<Startup>();

        _server = new TestServer(hostBulider);

        HttpClient = _server.CreateClient();
        HttpClient.BaseAddress = new Uri("http://localhost:5000");
    }

    public virtual void Dispose()
    {
        HttpClient.Dispose();
        _server.Dispose();
    }
}

public class EndpointTests : BaseResourceTests
{
    public EndpointTests()
        : base(Resource.VersionHeader)
    {
    }

    [Fact]
    public async Task Post_BodyHasValidDto_ReturnsCreated()
    {
        var dto = new Dto { Name = "someDto" };

        var response = await HttpClient.PostAsJsonAsync("/api/someEndpoint", dto);

        Check.That(response.StatusCode).IsEqualTo(HttpStatusCode.Created);
    }
}

我的測試很好,它可以很好地達到控制器中的動作。 但是在現實生活中,測試稍微復雜一點,我需要添加一些服務和自定義測試配置。

為了做到這一點,我創建了一個繼承自我的原始項目Startup類的TestStartup:

public class TestStartup : Startup
{
    public TestStartup(IHostingEnvironment env) : base(env)
    {
    }

    public override void ConfigureServices(IServiceCollection services)
    {
        base.ConfigureServices(services);
    }

    public override void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        base.Configure(app, env, loggerFactory);
    }
}

正如您所看到的,它只委托給基類,所以現在我更改構建器以使用我的TestStartup代碼:

    protected BaseResourceTests(string resourceVersion)
    {
        var hostBulider = new WebHostBuilder()
            .UseStartup<TestStartup>();

        _server = new TestServer(hostBulider);

        HttpClient = _server.CreateClient();
        HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(resourceVersion));
        HttpClient.BaseAddress = new Uri("http://localhost:5000");
    }

現在,測試失敗了Http NotFound異常。 調試時,結果是控制器中的操作不再受測試代碼的影響。

我的猜測是,如果啟動文件是與控制器不同的程序集,mvc不會檢測到路由,我該如何解決這個問題呢?

為了使重寫的啟動類工作,我必須做的另一項更改是將IHostingEnvironment對象中的ApplicationName設置為Web項目的實際名稱。

public TestStartup(IHostingEnvironment env) : base(env)
        {
            env.ApplicationName = "Demo.Web";
        }

當TestStartup位於不同的程序集中並覆蓋原始的Startup類時,這是必需的。 在我的案例中仍然需要UseContentRoot。

如果沒有設置名稱,我總是找不到404。

我在這里寫了一篇關於用xUnit進行這種集成測試的帖子: http//andrewlock.net/introduction-to-integration-testing-with-xunit-and-testserver-in-asp-net-core


我采用的方法是創建一個可以注入到測試類中的Fixture類。

夾具:

public class TestFixture<TStartup> : IDisposable where TStartup : class  
{
    private readonly TestServer _server;

    public TestFixture()
    {
        var builder = new WebHostBuilder().UseStartup<TStartup>();
        _server = new TestServer(builder);

        Client = _server.CreateClient();
        Client.BaseAddress = new Uri("http://localhost:5000");
    }

    public HttpClient Client { get; }

    public void Dispose()
    {
        Client.Dispose();
        _server.Dispose();
    }
}

然后測試類實現IClassFixture<TestFixture<TStartup>>

public class MiddlewareIntegrationTests : IClassFixture<TestFixture<SystemUnderTest.Startup>>  
{
    public MiddlewareIntegrationTests(TestFixture<SystemUnderTest.Startup> fixture)
    {
        Client = fixture.Client;
    }

    public HttpClient Client { get; }

    [Fact]
    public async Task AllMethods_RemovesServerHeader(string method)
    {
       // Arrange
       var request = new HttpRequestMessage(new HttpMethod("GET"), "/");

       // Act
       var response = await Client.SendAsync(request);

       //assert etc
    }
}

要使用MVC並確保可以發現您的視圖,您應該更新WebHostBuilder以設置內容路徑:

var path = PlatformServices.Default.Application.ApplicationBasePath;
var setDir = Path.GetFullPath(Path.Combine(path, <projectpathdirectory> ));

var builder = new WebHostBuilder()
    .UseContentRoot(setDir)
    .UseStartup<TStartup>();

您使用的.net核心版本是什么? preview1?

更新到RTM(preview2--31 ...)也許你遇到了一個已修復的bug。

您不能通過這種方式通過測試服務覆蓋您的服務。 我所做的是創建添加依賴項並使方法過度的方法。 然后在我的測試中,我將覆蓋該方法並注入不同的依賴項。

我也在我的博客中解釋了這一點: http//www.stefanhendriks.com/2016/04/29/integration-testing-your-dot-net-core-app-with-an-in-memory-database/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM