You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web API单元测试工作机制及代码中Act环节原理咨询

问题

我有一段运行正常的代码,但无法理解其中Act环节的工作原理。调试时该代码未访问数据库(这符合单元测试使用Mock数据而非真实数据库的预期),但想了解下述代码中Act行的作用,以及它如何通过与Mock数据对比让测试成功。代码如下:

[Fact]
public async Task GetEmployee_ShouldReturnOk()
{
    //arrange
    var employees = fixure.Create<List<Employee>>();
    var empName = fixure.Create<string>();

    empService.Setup(x => x.GetEmployee(empName)).ReturnsAsync(employees);
    
    //act
    //this line is calling a controller method but not hitting to data access layer. So from where its getting data?
    var employeesResult = await EmpController.GetEmployee(empName);
    //assert
    employeesResult.Should().NotBeNull();
    employeesResult.Should().BeAssignableTo<ActionResult<IEnumerable<Employee>>>();
    employeesResult.Result.Should().BeAssignableTo<OkObjectResult>();
    empService.Verify(x=>x.GetEmployee(empName), Times.Once());
}

解析

Act环节的作用

Act行var employeesResult = await EmpController.GetEmployee(empName)是单元测试的核心执行步骤:

  • 它直接调用控制器的GetEmployee方法,传入预设的empName参数,模拟真实业务中客户端调用接口的场景。
  • 这一步的目的是验证控制器方法的业务逻辑处理流程是否符合预期,比如参数传递、调用服务层、返回结果封装等,而非测试数据访问层。

数据来源:Mock服务的预设行为

调试时没访问数据库,是因为代码里的empService是一个Mock对象(通常由Moq这类框架创建):

  • 在Arrange阶段,empService.Setup(x => x.GetEmployee(empName)).ReturnsAsync(employees)这段代码给Mock服务预设了行为:当调用GetEmployee并传入指定的empName时,直接返回提前用Fixture生成的employees列表,完全绕过真实的数据库访问逻辑。
  • 控制器的GetEmployee方法内部依赖的是这个Mock服务实例,而非真实的服务实现,所以执行时会直接用预设好的Mock数据,不会碰数据库。

测试成功的逻辑

测试通过的核心是验证控制器的行为符合预期:

  1. 结果有效性验证:断言返回结果不为空、类型正确,且是OkObjectResult(即HTTP 200响应),确保控制器正确封装了返回值。
  2. 服务调用验证:empService.Verify(x=>x.GetEmployee(empName), Times.Once())断言Mock服务的GetEmployee方法被精确调用了一次,确保控制器正确触发了服务层的方法,没有多调用或少调用。
  3. 虽然代码里没直接对比返回的employeesResult和预设的employees列表,但如果控制器逻辑正常,它会把Mock服务返回的employees封装成OkObjectResult返回,结合前面的类型断言,间接验证了数据传递的正确性。如果需要更严格的验证,还可以添加断言对比返回结果中的数据与预设Mock数据是否一致。

内容的提问来源于stack exchange,提问作者niler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:40:30