????????正常情況下,中間件會(huì)在主程序入口統(tǒng)一進(jìn)行實(shí)例化,這樣如果想單獨(dú)測(cè)試某一個(gè)中間件就很不方便,為了能測(cè)試單個(gè)中間件,可以使用?TestServer?單獨(dú)測(cè)試。 這樣便可以:
- 實(shí)例化只包含需要測(cè)試的組件的應(yīng)用管道。
- 發(fā)送自定義請(qǐng)求以驗(yàn)證中間件行為。
這樣測(cè)試的優(yōu)點(diǎn):
- 請(qǐng)求會(huì)發(fā)送到內(nèi)存中,而不是通過網(wǎng)絡(luò)進(jìn)行序列化。
- 這樣可以避免產(chǎn)生額外的問題,例如端口管理和 HTTPS 證書。
- 中間件中的異常可以直接流回調(diào)用測(cè)試。
- 可以直接在測(cè)試中自定義服務(wù)器數(shù)據(jù)結(jié)構(gòu),如?HttpContext。
設(shè)置 TestServer
在測(cè)試項(xiàng)目中,創(chuàng)建測(cè)試:
-
生成并啟動(dòng)使用?TestServer?的主機(jī)。
-
添加中間件使用的任何所需服務(wù)。
-
為?Microsoft.AspNetCore.TestHost?NuGet 包添加對(duì)項(xiàng)目的包引用。
-
將處理管道配置為使用中間件進(jìn)行測(cè)試。
我這寫了一個(gè)簡(jiǎn)單的測(cè)試代碼:
測(cè)試類:
public class UnitTest1
{
[Fact]
public async Task MiddlewareTest()
{
using var host = await new HostBuilder()
.ConfigureWebHost(webBuilder =>
{
webBuilder
.UseTestServer()
.ConfigureServices(services =>
{
services.AddRouting();
})
.Configure(app =>
{
app.UseRouting();
app.UseMiddleware<MyMiddleware>();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/hello", () =>
"Hello Tests");
});
});
})
.StartAsync();
var client = host.GetTestClient();
var response = await client.GetAsync("/hello");
Assert.True(response.IsSuccessStatusCode);
var responseBody = await response.Content.ReadAsStringAsync();
Assert.Equal("Hello Tests", responseBody);
}
}
自定義的 MyMiddleware 代碼如下:
public class MyMiddleware
{
private readonly RequestDelegate _next;//請(qǐng)求委托:用于生成請(qǐng)求管道
public MyMiddleware(ILogger<MyMiddleware> logger, RequestDelegate next)
{
_next = next;
}
public Task InvokeAsync(HttpContext context)
{
//context.Response.StatusCode = (int)HttpStatusCode.Found;
// 調(diào)用下一個(gè)中間件
return _next(context);
}
}
?運(yùn)行測(cè)試:
測(cè)試通過:
接下來(lái)我們通過MyMiddleware自定義中間件設(shè)置一下響應(yīng)狀態(tài) StatusCode 為302:
再次調(diào)試測(cè)試一下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-807470.html
可以看到 StatusCode: 302 ,測(cè)試沒通過,證明自定義中間件是沒問題的。?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-807470.html
到了這里,關(guān)于測(cè)試 ASP.NET Core 中間件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!