我正在尝试对我的 WEB API 项目中的 API 进行单元测试 CRUD 操作。我很难弄清楚如何删除。以下是我的服务;
public async Task DeleteCompany(int id)
{
var query = "DELETE FROM Companies WHERE Id = @Id";
using(var connection = _context.CreateConnection())
{
await connection.ExecuteAsync(query, new {id});
}
}
这是控制器
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteCompany(int id)
{
var company = await _companyRepository.GetCompanyById(id);
if (company == null)
{
return NotFound();
}
await _companyRepository.DeleteCompany(id);
return NoContent();
}
下面是单元测试的代码
[Theory]
[InlineData(1)]
public async Task CompanyController_DeleteCompany_ShouldReturnStatusCode204(int id)
{
var mockCompany = new Mock<ICompanyRepository>();
mockCompany.Setup(service => service.DeleteCompany(id))
.Returns(Task.CompletedTask)
.Verifiable();
var sut = new CompanyController(mockCompany.Object);
var result = (OkObjectResult) await sut.DeleteCompany(id);
result.StatusCode.Should().Be(204);
}
事实证明,调试后它返回我的模型(本例中为公司)的空值。这就是为什么测试没有通过并且在控制器中出现 NotFound 错误的原因。
您需要设置 Test Double 的
GetCompanyById
方法,使其不返回 null:
[Theory]
[InlineData(1)]
public async Task CompanyController_DeleteCompany_ShouldReturnStatusCode204(int id)
{
var mockCompany = new Mock<ICompanyRepository>();
mockCompany.Setup(service => service.GetCompanyById(id))
.ReturnsAsync(/*pass non-null value here*/);
var sut = new CompanyController(mockCompany.Object);
var result = (OkObjectResult) await sut.DeleteCompany(id);
result.StatusCode.Should().Be(204);
mockCompany.Verify(service => service.DeleteCompany(id);
}
另一方面,您不需要将
DeleteCompany
设置为可验证的操作,因为它无论如何都不会返回任何内容。 命令的模拟,查询的存根。使用 mockCompany.Verify
代替,如上所示。