如何使用moq和xUnit对删除操作进行单元测试?

问题描述 投票:0回答:1

我正在尝试对我的 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 错误的原因。

c# unit-testing moq xunit fluent-assertions
1个回答
0
投票

您需要设置 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
代替,如上所示。

© www.soinside.com 2019 - 2024. All rights reserved.