2017-02-09 3 views
1

Я хочу, чтобы проверить это (метод контроллера):Каковы будут тесты в достаточной степени. Испытайте метод «Создать» в 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.

Любое понимание будет оценено по достоинству.

Этот Post кажется близким к тому, что я хочу.

+0

Это потому, что модель была создана в рамках методы тестируемого поэтому он не соответствует. что вы можете сделать, это использовать «It.Is» с предикатом, который соответствует свойствам модели. – Nkosi

ответ

1

Вы можете только проверить следующие вещи в своем действии:

  1. Случай, когда модель справедлива.
  2. Случай, когда модель недействительна.

Имеются только два случая. Если выполняется первый случай, вы можете проверить, что AddAsync() выполняется с любым параметром, который является типом SecurityQuestion.

Вы можете издеваться 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() выдает исключение.

+0

Спасибо. Это очень полезно! –

1

Проверка завершается неудачно, потому что модель была создана в рамках тестируемого метода, поэтому она не совпадает. что вы можете сделать, это использовать It.Is с предикатом, который соответствует свойствам модели

_repository.Verify(r => r.AddAsync(It.Is<SecurityQuestion>(m => m.questionText == dataModel.questionText)), Times.Once); 
Смежные вопросы