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

如果我们要查看 API 具体返回了什么,可以通过加断点调试来查看返回结果的变量字符串值,但这种方式不是最好的选择。比如对于同一个 API,我要看看 10 种参数返回的结果是什么样的,每次都通过断点调试来查看就很麻烦。

除了添加断点来调试,还有一种打印日志的方法来快速调试,xUnit 可以很方便地做到这一点。为此我们来修改一ValuesTests:

public ValuesTests(ITestOutputHelper outputHelper) { var server = new TestServer(WebHost.CreateDefaultBuilder() .UseStartup<Startup>()); Client = server.CreateClient(); Output = outputHelper; } public ITestOutputHelper Output{ get; } // ... (省略其它代码)

这里我们在构造函数中添加了 ITestOutputHelper 参数,xUnit 会将一个实现此接口的实例注入进来。拿到这个实例后,我们就可以用它来输出日志了:

[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 单元测试的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjfpyy.html