【发布时间】:2019-08-08 22:59:56
【问题描述】:
我正在使用 xUnit 和 Moq 在 asp.net 核心项目中对控制器逻辑进行单元测试,但在测试删除方法时遇到了问题。我试图将来自不同教程等的一些想法放在一起,但仍然在苦苦挣扎。
我已设法测试该方法是否返回 NoContentResult 和 NotFoundResponse。我在这里缺少的是测试删除方法实际上已经从 Bygg 存储库中删除了一个项目。
在这种情况下,我在这里尝试做的是检索 Bygg 的列表,删除一个项目,然后使用 assert 检查列表现在是否只包含 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);
}
【问题讨论】:
-
您可以尝试在执行测试时验证模拟是否收到预期的调用。无需获取所有和检查项目
-
你嘲笑了
DeleteByggAsync方法,所以它实际上不会删除任何东西。也许这是错误的测试场景。您也许可以验证是否使用预期的参数调用了DeleteByggAsync。测试实际删除的地方是在单元测试时byggRepository... -
您似乎还试图在一个单元测试中测试太多东西。
-
要扩展 NKosi 所说的内容,您需要保持测试简单。在这种情况下,您实际上并不关心是否删除了某些内容,因为您的 DeleteByggAsync 测试应该验证这一点。对于控制器,您只关心调用是否被正确委派。在编写测试时,始终考虑可以删除/简化的内容
-
仅供参考,这不是单元测试。这是集成测试。您在 Web 上下文(控制器)中,并且正在测试 EF 和数据库交互。
标签: c# unit-testing asynchronous asp.net-core moq