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

时间:2019-03-18 14:29:03

标签: c# unit-testing asynchronous asp.net-core moq

我正在使用xUnit和Moq在asp.net核心项目中对控制器逻辑进行单元测试,而在测试delete方法时遇到了麻烦。我试图将来自不同教程等的一些想法放到一起,但是仍然很挣扎。

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

在这种情况下,我想做的是检索Bygg的列表,删除一个项目,然后使用assert检查该列表现在是否仅包含2个项目。

fyi: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);
}

1 个答案:

答案 0 :(得分:1)

由于您没有从ReferenceError: client is not defined方法返回任何内容,因此只需在测试方法中验证DeleteBygg在您的实际方法中正确调用,如下所示:

await _byggRepository.DeleteByggAsync(bygg);