我们提供安全,免费的手游软件下载!
在ASP.NET Core生态系统中,通常使用Microsoft.AspNetCore.TestHost的TestServer或.NET 6后提供的Microsoft.AspNetCore.Mvc.Testing的WebApplicationFactory进行测试。后者是前者的封装,专门用于测试ASP.NET Core应用程序。同时,Alba也是基于前者的封装,同样提供了一些好用的测试体验。
以下是Alba提供的一些便捷的测试方式,使得编写和执行集成测试变得更加简单和高效。无论是基本的HTTP请求测试、带有依赖注入的请求测试、POST请求测试、带有认证的请求测试,还是复杂的请求和响应测试,Alba都能很好地满足你的需求。通过使用Alba,你可以更轻松地编写可靠的集成测试,确保你的应用程序在各种情况下都能正常工作。
首先,你需要在项目中安装Alba包。可以使用以下命令通过NuGet包管理器进行安装:
dotnet add package Alba
为了演示Alba的使用,我们首先创建一个简单的ASP.NET Core应用程序。这个应用程序包含一个返回 "Hello, World!" 的MinimalApi请求。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello, World!");
app.Run();
namespace TestCase
{
public partial class Program { } //定义一个入口点用于测试
}
接下来,我们使用Alba创建一个基于xUnit的集成测试,测试上述应用程序。
using Alba;
public class IntegrationTests
{
[Fact]
public async Task Get_Home_Returns_HelloWorld()
{
using var host = await AlbaHost.For(builder =>
{
// 这里可以配置服务和中间件
});
await host.Scenario(scenario =>
{
scenario.Get.Url("/");
scenario.StatusCodeShouldBeOk();
scenario.ContentShouldBe("Hello, World!");
});
}
}
AlbaHost有一个方法Scenario(x=>{})用于定义测试场景。例如,场景使用GET请求起始页并断言是否返回200,以及返回的文本是否是Hello, World!
对于内置场景没有支撑到位的断言,我们也可以使用参数接收IScenarioResult自行断言:
var myScenario = await _host.Scenario(_ =>
{
_.Get.Url("/");
});
Assert.Equal("true", myScenario.ReadAsText());
Assert.Equal(200, myScenario.Context.Response.StatusCode);
对于POST等方式提供链式的语法风格,Alba会自动帮我们序列化:
using Alba;
public class IntegrationTests
{
[Fact]
public async Task Post_Data_Returns_Correct_Response()
{
using var host = await AlbaHost.For();
await host.Scenario(scenario =>
{
scenario.Post.Json(new { Name = "Test" }).ToUrl("/data");
scenario.StatusCodeShouldBeOk();
scenario.ContentShouldBe("Received: Test");
});
}
}
对于Xml和FormData的POST,Scenario也是提供支持的。
//xml
scenario.Post.Xml(new Input {Name = "vipwan", Age = 18});
//form
public async Task write_form_data(IAlbaHost system)
{
var form1 = new Dictionary
{
["a"] = "what?",
["b"] = "now?",
["c"] = "really?"
};
await system.Scenario(_ =>
{
_.WriteFormData(form1);
});
}
当然,除了传参的时候自动序列化,Alba对响应的返回也提供了反序列化支持。
public async Task read_json(IAlbaHost host)
{
var result = await host.Scenario(_ =>
{
_.Get.Url("/output");
});
var output = result.ReadAsJsonAsync
如果需要测试需要鉴权认证的请求,Alba也帮我们做了封装。我们只需要实例化AuthenticationStub或者JwtSecurityStub,亦或者实现OpenConnectExtension,然后在实例化AlbaHost时传入即可。
var securityStub = new AuthenticationStub()
.With("foo", "bar")//演示添加的claim
.With(JwtRegisteredClaimNames.Email, "vipwan@co.ltd")//演示添加的claim
.WithName("vipwan");
myHost = await AlbaHost.For(securityStub);
如上面的代码只要我们使用myHost实例创建的任何场景将自动附加相应的认证信息。
//当请求需要认证的时候也可以通过测试
app.MapGet("/", () => "Hello, World!").RequireAuthorization();
对于请求Alba还支持请求的AOP,比如请求前后我们需要对HttpContext做一些改动。
public void sample_usage(AlbaHost system)
{
// Synchronously
system.BeforeEach(context =>
{
context.Request.Headers.Add("trace", "something");
});
system.AfterEach(context =>
{
// perform an action immediately after the scenario/HTTP request
// is executed
});
// Asynchronously
system.BeforeEachAsync(context =>
{
return Task.CompletedTask;
});
system.AfterEachAsync(context =>
{
return Task.CompletedTask;
});
}
这里介绍了一些Alba的特性和使用方式,当然还不完善。如果你对这个库感兴趣可以点击链接查看官方的文档。
Alba是一个比较简单的测试库,提供了我们对Web项目测试常用的场景封装。Alba提供了多种便捷的测试方式,使得编写和执行集成测试变得更加简单和高效。通过使用Alba,你可以更轻松地编写可靠的集成测试,确保你的应用程序在各种情况下都能正常工作。
Alba Host简单架构:
热门资讯