xUnit 编写 ASP.NET Core 单元测试的方法

2020-06-09 19:00:23王冬梅

[Fact]
public async Task GetById_ShouldBe_Ok()
{
 // Arrange
 var id = 1;

 // Act
 var response = await Client.GetAsync($"/api/values/{id}");

 // Output
 var responseText = await response.Content.ReadAsStringAsync();
 Output.WriteLine(responseText);

 // Assert
 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}

运行(注意不是 Debug)此方法,运行结束后,在“Test Explore”的下方可以可以看到“Output”字样,点击它就可以看到输出的结果,如图:

通过这种方式,每次运行测试我们就可以很方便的查看输出结果了。

其它

上面我们是通过模拟 Http 请求的方式来调用 API 测试的,还有一种就是 new 一个 Controller 来直接调用它的 Action 方法来测试。比如这样:

// Arrange
var id = 1;
var controller = new ValuesController();
// Act
var result = controller.Get(id);

如果 Controller 没有其它依赖,这种方式当然是最方便的。但通常 Controller 是会有一个或多个依赖的,比如这样:

public class ValuesController : Controller
{
 private readonly ISessionRepository _sessionRepository;

 public ValuesController(ISessionRepository sessionRepository)
 {
  _sessionRepository = sessionRepository;
 }

 // ...
}

我们就要模拟实例化这个 Controller 的所有依赖,当然手动模拟是不现实的,因为一个依赖类还可能会依赖其它的类或接口,依赖链可能很长,你不可能每个依赖都手动去实例化它们。有一个叫 Moq 的工具可以自动来模拟实例化依赖,它的用法是这样的:

// ..
// Arrange
var mockRepo = new Mock<ISessionRepository>();
mockRepo.Setup(...);
var controller = new HomeController(mockRepo.Object);

// Act
var result = await controller.Index();

这种方式我是不推荐的,因为抛开 Moq 的学习成本不说,重要的是它不如模拟 Http 请求那样接近真实的调用场景,所以本文对它不作过多的介绍,大家知道有这么回事就行。

以上就是xUnit 编写 ASP.NET Core 单元测试的方法的详细内容,更多关于xUnit 编写 ASP.NET Core 单元测试的资料请关注易采站长站其它相关文章!