还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层做单元测试简直就是灾难啊。.NET Core 吸取教训,在设计上考虑到了可测试性,就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的。其中面向接口和依赖注入在这方面起到了非常重要的作用。
本文就来手把手教你如何用 xUnit 对 ASP.NET Core 应用做单元测试。.NET Core 常用的测试工具还有 NUnit 和 MSTest,我本人习惯用 xUnit 作为测试工具,所以本文用的是 xUnit。
创建示例项目
先用 ASP.NET Core API 模板建一个应用。
模板为我们自动创建了一个 ValuesController,为了方便演示,我们只留其中一个 Get 方法:
public class ValuesController : ControllerBase
{
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "value";
}
}
然后再添加一个 xUnit 单元测试项目:
模板自动为我们添加好了 xUnit 引用:
<ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> <PackageReference Include="xunit" Version="2.4.0" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> </ItemGroup>
但要测试 ASP.NET Core 应用还需要添加两个 NuGet 包:
Install-Package Microsoft.AspNetCore.App
Install-Package Microsoft.AspNetCore.TestHost
当然还要引入目标项目。最后的引用是这样的:
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.5" /> <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.1.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> <PackageReference Include="xunit" Version="2.4.0" /> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..WebApplication1WebApplication1.csproj" /> </ItemGroup>
添加完引用后编译一下,确认引用没有问题。
编写单元测试
写单元测试一般有三个步骤:Arrange,Act 和 Assert。
Arrange 是准备阶段,这个阶段是准备工作,比如模拟数据、初始化对象等;
Act 是行为阶段,这个阶段是用准备好的数据去调用要测试的方法;
Assert 是断定阶段,就是把调用目标方法返回的值和预期的值进行比较,如果和预期一致说明测试通过,否则为失败。
按照这个步骤我们来编写一个单元测试方法,以 ValuesController 中的 Get 方法作为要测试的目标。一般一个单元测试方法就是一个测试用例。
我们在测试工程添加一个 ValuesTests 单元测试类,然后编写一个单元测试方法,代码如下:








