Test ASP.NET Core ara yazılımı

ChrisRis tarafından

Ara yazılım ile yalıtarak test TestServer edilebilir. Şunları sağlar:

  • Yalnızca test etmek için ihtiyacınız olan bileşenleri içeren bir uygulama işlem hattı örneği açın.
  • Ara yazılım davranışını doğrulamak için özel istekler gönderin.

Artılar:

  • İstekler ağ üzerinden seri hale getirilecek şekilde değil bellek içinde gönderilir.
  • Bu, bağlantı noktası yönetimi ve HTTPS sertifikaları gibi ek endişelerin önüne geçmektedir.
  • Ara yazılımdaki özel durumlar doğrudan çağıran teste geri akabilirsiniz.
  • gibi sunucu veri yapılarını doğrudan HttpContext testte özelleştirmek mümkündür.

TestServer'ı ayarlama

Test projesinde bir test oluşturun:

  • kullanan bir konak derleme ve TestServer başlatma.

  • Ara yazılımların kullandığı tüm gerekli hizmetleri ekleyin.

  • Microsoft.AspNetCore.TestHost NuGet paketini projeye ekleyin:

    <ItemGroup>
      <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.1.*" />
    </ItemGroup>
    
  • İşlem işlem hattını test için ara yazılımı kullanmak üzere yapılandırma.

[Fact]
public async Task MiddlewareTest_ReturnsNotFoundForRequest()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .ConfigureServices(services =>
                {
                    services.AddMyServices();
                })
                .Configure(app =>
                {
                    app.UseMiddleware<MyMiddleware>();
                });
        })
        .StartAsync();

    ...
}

HttpClient ile istek gönderme

kullanarak istek HttpClient gönderme:

[Fact]
public async Task MiddlewareTest_ReturnsNotFoundForRequest()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .ConfigureServices(services =>
                {
                    services.AddMyServices();
                })
                .Configure(app =>
                {
                    app.UseMiddleware<MyMiddleware>();
                });
        })
        .StartAsync();

    var response = await host.GetTestClient().GetAsync("/");

    ...
}

Sonucu onaylar. İlk olarak, bir onay beklediğiniz sonucun tersidir. Hatalı pozitif onay ile yapılan ilk çalıştırma, ara yazılım doğru performans sergileyene kadar testin başarısız olduğunu onaylar. Testi çalıştırın ve testin başarısız olduğunu onaylayın.

Aşağıdaki örnekte, kök uç nokta isten geldiğinde ara yazılım bir 404 durum kodu ( Bulunamadı ) dönüşletir. İlk testi ile Assert.NotEqual( ... ); çalıştırın; başarısız olması gerekir:

[Fact]
public async Task MiddlewareTest_ReturnsNotFoundForRequest()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .ConfigureServices(services =>
                {
                    services.AddMyServices();
                })
                .Configure(app =>
                {
                    app.UseMiddleware<MyMiddleware>();
                });
        })
        .StartAsync();

    var response = await host.GetTestClient().GetAsync("/");

    Assert.NotEqual(HttpStatusCode.NotFound, response.StatusCode);
}

Normal çalışma koşulları altında ara yazılımı test etmek için onaylamayı değiştirme. Son testte Assert.Equal( ... ); kullanır. Testi tekrar çalıştırarak başarılı olduğunu onaylayın.

[Fact]
public async Task MiddlewareTest_ReturnsNotFoundForRequest()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .ConfigureServices(services =>
                {
                    services.AddMyServices();
                })
                .Configure(app =>
                {
                    app.UseMiddleware<MyMiddleware>();
                });
        })
        .StartAsync();

    var response = await host.GetTestClient().GetAsync("/");

    Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}

HttpContext ile istek gönderme

Bir test uygulaması, SendAsync(Action <HttpContext> , CancellationToken) kullanarak da istek gönderebilir. Aşağıdaki örnekte, ara yazılım tarafından işlendiğinde https://example.com/A/Path/?and=query çeşitli denetimler yapılır:

[Fact]
public async Task TestMiddleware_ExpectedResponse()
{
    using var host = await new HostBuilder()
        .ConfigureWebHost(webBuilder =>
        {
            webBuilder
                .UseTestServer()
                .ConfigureServices(services =>
                {
                    services.AddMyServices();
                })
                .Configure(app =>
                {
                    app.UseMiddleware<MyMiddleware>();
                });
        })
        .StartAsync();

    var server = host.GetTestServer();
    server.BaseAddress = new Uri("https://example.com/A/Path/");

    var context = await server.SendAsync(c =>
    {
        c.Request.Method = HttpMethods.Post;
        c.Request.Path = "/and/file.txt";
        c.Request.QueryString = new QueryString("?and=query");
    });

    Assert.True(context.RequestAborted.CanBeCanceled);
    Assert.Equal(HttpProtocol.Http11, context.Request.Protocol);
    Assert.Equal("POST", context.Request.Method);
    Assert.Equal("https", context.Request.Scheme);
    Assert.Equal("example.com", context.Request.Host.Value);
    Assert.Equal("/A/Path", context.Request.PathBase.Value);
    Assert.Equal("/and/file.txt", context.Request.Path.Value);
    Assert.Equal("?and=query", context.Request.QueryString.Value);
    Assert.NotNull(context.Request.Body);
    Assert.NotNull(context.Request.Headers);
    Assert.NotNull(context.Response.Headers);
    Assert.NotNull(context.Response.Body);
    Assert.Equal(404, context.Response.StatusCode);
    Assert.Null(context.Features.Get<IHttpResponseFeature>().ReasonPhrase);
}

SendAsync soyutlamaları kullanmak yerine HttpContext bir nesnenin doğrudan yapılandırmasına izin HttpClient sağlar. Yalnızca SendAsync sunucuda bulunan HttpContext.Items veya HttpContext.Features gibi yapıları işlemek için kullanın.

404 - Bulunamadı yanıtı için test edilen önceki örnekte olduğu gibi, önceki testte her Assert deyimin tersini kontrol edin. Denetim, ara yazılım normal şekilde çalışıyorken testin düzgün başarısız olduğunu onaylar. Hatalı pozitif testin çalıştığını onaylandıktan sonra, Assert testin beklenen koşulları ve değerlerinin son deyimlerini ayarlayın. Testin başarılı olduğunu doğrulamak için yeniden çalıştırın.

TestServer sınırlamaları

TestServer:

  • Ara yazılımı test etmek için sunucu davranışlarını çoğaltmak için oluşturuldu.
  • Tüm davranışları çoğaltmayı HttpClient denemez.
  • İstemciye sunucu üzerinde mümkün olduğunca çok denetim ve sunucuda mümkün olduğunca çok görünürlük sağlar. Örneğin, sunucu durumunu doğrudan iletişim kurmak için tarafından normalde HttpClient tarafından atılan özel durumlar oluşturur.
  • Taşımaya özgü bazı üst bilgileri varsayılan olarak ayarlamaz çünkü bunlar genellikle ara yazılımla ilgili değildir. Daha fazla bilgi için sonraki bölüme bakın.

İçerik Uzunluğu ve Transfer-Encoding üst bilgileri

TestServer, aktarımla ilgili istek veya Content-Length veya Transfer-Encoding gibi yanıt üst bilgilerini ayarlamaz. Uygulamalar, kullanımları istemciye, senaryoya ve protokole göre değişiklik gösterir çünkü uygulamalar bu üst bilgilerine bağlı olarak kaçınılmalıdır. Belirli bir senaryoyu test etmek için ve gerekiyorsa, bunlar veya Content-Length Transfer-Encoding oluşturması için testte HttpRequestMessage HttpContext belirtilebilir. Daha fazla bilgi için aşağıdaki sorun GitHub bakın: