集成测试示例
一个展示如何针对控制器进行集成测试的 ASP.NET Core 示例项目
在这篇文章中,我将简要介绍如何测试 ASP.NET Core 控制器。
请注意,“集成测试”一词还涵盖其他情况,例如测试数据访问或访问文件系统。
常见的 ASP.NET Core 项目结构设计原则是:
.
├── src
│ └── MyProject.Api
│ └── Controllers
│ └── ValuesController
└── test
├── IntegrationTests
│ └── MyProject.Api.Test
│ └── ValuesControllerTest
└── UnitTests
创建一个 .NET Core 测试项目,然后安装该Microsoft.AspNetCore.TestHost包。
该包将提供配置选项TestServer。
> Install-Package Microsoft.AspNetCore.TestHost
创建一个基类,我们的ControllerTest其他类可以继承它。我们将设置TestServer并HttpClient使用它来执行请求。
[TestClass]
public abstract class IntegrationTestInitializer
{
protected HttpClient _client;
[TestInitialize]
public void Setup()
{
var builder = new WebHostBuilder()
.UseStartup<Startup>();
var server = new TestServer(builder);
_client = server.CreateClient();
}
}
ControllerTest假设我们要测试的控制器如下所示
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
}
有了基类,我们就可以简单地继承基类,并使用我们的类_client来向 API 发出请求。
[TestClass]
public class ValuesControllerTest : IntegrationTestInitializer
{
[TestMethod]
public async Task CanGetValues()
{
List<string> expectedResponse = new List<string> { "value1", "value2" };
var responseJson = await _client.GetStringAsync("api/values");
List<string> actualResponse = JsonConvert.DeserializeObject<List<string>>(responseJson);
Assert.AreEqual(expectedResponse.Count, actualResponse.Count);
foreach(var expectedValue in expectedResponse)
{
Assert.IsTrue(actualResponse.Contains(expectedValue));
}
}
}
本文介绍了如何对一个非常基础的 ASP.NET Core API 进行集成测试。
在实际应用中,API 背后通常会有一个需要访问的数据库,而且某些端点可能还会受到 API 密钥或 JWT 的保护。
不过,本文仅作为集成测试的简要介绍。
一个展示如何针对控制器进行集成测试的 ASP.NET Core 示例项目