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);
}
我在使用 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);
}