Asp.Net 控制器中的核心单元测试删除方法

Asp.Net Core Unit Testing Delete Method in controller

我在使用 xUnit 和 Moq 的 asp.net 核心项目中对控制器逻辑进行单元测试,我在测试删除方法时遇到了问题。我试图将来自不同教程等的一些想法放在一起,但仍在努力。

我已经设法测试方法 returns NoContentResult 和 NotFoundResponse。我在这里缺少的是查看 delete 方法实际上已经从 Bygg 存储库中删除了一个项目的测试。

在这种情况下,我在这里尝试做的是检索 Bygg 的列表,删除一个项目,然后使用断言检查列表现在是否只包含 2 个项目。

仅供参考:bygg = 建筑。

该项目遵循具有通用和用户特定存储库的存储库模式。

这是控制器中的删除方法:

[HttpDelete("{id}")]
public async Task<IActionResult> DeleteBygg(int id)
{
    try
    {
        var bygg = await _byggRepository.GetByggByIdAsync(id);
        if (bygg == null)
        {
            return NotFound();
        }

        await _byggRepository.DeleteByggAsync(bygg);

        return NoContent();
    }
    catch (Exception ex)
    {
        return StatusCode(500, "Internal Server Error");
    }
}

这是测试方法:

[Fact]
public async Task DeleteBygg_ExistingIdPassed_RemovesOneItem()
{
    // Arrange
    _mockRepo.Setup(repo => repo.DeleteByggAsync(It.IsAny<Bygg>()));
    _mockRepo.Setup(repo => repo.GetAllByggAsync())
        .ReturnsAsync(GetTestBygg());

    // Act
    var actual = await _controller.GetAllBygg();
    var actual2 = actual as OkObjectResult;
    var noContentResponse = await _controller.DeleteBygg(1);


    // Assert
    var items = Assert.IsType<List<Bygg>>(actual2.Value);
    Assert.Equal(2, items.Count);
}

由于您没有从 DeleteBygg 方法返回任何内容,因此您只需在测试方法中验证 await _byggRepository.DeleteByggAsync(bygg); 是否在您的实际方法中正确调用,如下所示:

[Fact]
public async Task DeleteBygg_ExistingIdPassed_RemovesOneItem()
{        
    // Arrange
    var id = 1;
    _mockRepo.Setup(repo => repo.GetByggByIdAsync(id)).ReturnsAsync(new Bygg(){});
    _mockRepo.Setup(repo => repo.DeleteByggAsync(It.IsAny<Bygg>())).Returns(Task.CompletedTask);

    // Act
    await _controller.DeleteBygg(id);

    // Assert
    _mockRepo.Verify(repo => repo.DeleteByggAsync(It.IsAny<Bygg>()),Times.Once);
}