我正在使用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);
}
答案 0 :(得分:1)
由于您没有从ReferenceError: client is not defined
方法返回任何内容,因此只需在测试方法中验证DeleteBygg
在您的实际方法中正确调用,如下所示:
await _byggRepository.DeleteByggAsync(bygg);