[英]Whats tests would sufficiently Unit Test a “Create” controller method in MVC?
我想测试一下(控制器方法):
public async Task<IActionResult> Create(SecurityQuestionViewModel securityQuestion)
{
if (ModelState.IsValid)
{
SecurityQuestion dataModel = new SecurityQuestion();
dataModel.questionText = securityQuestion.QuestionText;
await _securityRepository.AddAsync(dataModel);
return RedirectToAction("Index");
}
else
{
return View();
}
}
我的单元测试(到目前为止)看起来像这样吗?
public async Task ModelContainsNewObjectAfterCreate()
{
//Arrange
_repository = new Mock<ISecurityQuestionRepository>();
_repository.Setup(repo => repo.GetAllAsync()).Returns(Task.FromResult(securityQuestion()));
_controller = new SecurityQuestionsController(_repository.Object, _mapper);
SecurityQuestion dataModel = new SecurityQuestion();
dataModel.questionText = "This is the new added question";
SecurityQuestionViewModel sqvm = new SecurityQuestionViewModel();
sqvm.QuestionText = dataModel.questionText;
//Act
var result = await _controller.Create(sqvm);
//Assert
var viewResult = Assert.IsType<RedirectToActionResult>(result);
_repository.Verify(r => r.AddAsync(dataModel), Times.Once);
}
viewResult
通过。 _repository
验证没有。
感觉就像我需要验证AddAsync
方法是否已运行(将记录添加到现有存储库中)。 也许我的设置错误
感觉像还需要在AddAsync
方法运行后验证存储库中“问题”的数量。
我试图了解什么将构成一个适当的测试,以及如何用Moq模拟“添加”。
任何见识将不胜感激。
这篇文章似乎接近我想要的。
您只能在操作中测试以下内容:
只有两种情况。 如果满足第一种情况,则可以验证是否使用任何类型为SecurityQuestion
参数执行AddAsync()
。
您可以像这样模拟AddAsync()
:
repository.Setup(r => r.AddAsync(It.IsAny<SecurityQuestion>())
.Returns(Task.FromResult(false));
并验证:
repository.Verify(r => r.AddAsync(It.IsAny<SecurityQuestion>()), Times.Once);
那就是您所能做的!
您无法模拟SecurityQuestion
模型,因为它使用了new
关键字,应删除尝试模拟的代码。
这就是您需要做的所有事情,因为您的整个逻辑是if / else语句。 其他一切将正常执行。 如果AddAsync()
引发异常,则可能发生意外的另一件事。
验证失败,因为模型是在被测方法内创建的,因此不匹配。 您可以做的是将It.Is
与与模型属性匹配的谓词一起使用
_repository.Verify(r => r.AddAsync(It.Is<SecurityQuestion>(m => m.questionText == dataModel.questionText)), Times.Once);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.