繁体   English   中英

什么测试足以对MVC中的“创建”控制器方法进行单元测试?

[英]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模拟“添加”。

任何见识将不胜感激。

这篇文章似乎接近我想要的。

您只能在操作中测试以下内容:

  1. 模型有效的情况。
  2. 模型无效的情况。

只有两种情况。 如果满足第一种情况,则可以验证是否使用任何类型为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM