Как выполнить модульное тестирование блока захвата в контроллере ASP. Net Core MVC? - PullRequest
0 голосов
/ 24 февраля 2020

Как выполнить модульное тестирование приведенного ниже блока перехвата?

Ниже приведено определение моего контроллера:

public class RunController : Controller
{ 
    Public ActionResult GetExtraRun() 
    { 
        try{ 
             return View("ExtraRun"); 
        } catch(Exception ex) 
        { 
             _log.Error("Index -" + ex.Message, ex); 
             TempData[ErrorInfo] = GetErrorInfo(ex, "RunStatus"); 
             return RedirectToAction("Index", "RunErrorHandling"); 
        } 
     } 
} 

Я использую NUnit и Moq последней с Asp. NET Core * Версия 1019 * 3.0.

Таким образом, у меня будет два тестовых примера, как показано ниже

  1. ) Чтобы проверить, что это возврат, View успешно.
  2. ) Мне нужно проверить catch блок как часть покрытия кода.

Так что мне нужна помощь во втором пункте в приведенном выше коде.

1 Ответ

0 голосов
/ 25 февраля 2020

Чтобы протестировать желаемый блок кода, вам нужно заставить контроллер выдать исключение при вызове

return View("ExtraRun"); 

.

Это можно сделать путем насмешки над контроллером и переопределение функции View(string), то есть virtual

[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.ViewResult View (string viewName);

В следующем примере MOQ использовался для имитации контроллера и переопределения намеченной функции, так что Контроллер вел себя так, как ожидалось, когда проводился тест.

//Arrange
//...
var mock = new Mock<RunController>({inject dependencies here});
mock.CallBase = true;

var exception = new Exception("Sample message");

mock.Setup(_ => _.View(It.IsAny<string>())).Throws(exception);

RunController controller = mock.Object;

//Act
var actual = controller.GetExtraRun() as RedirectToActionResult;

//Assert
actual.Should().NotBeNull(); //FluentAssertions

//...perform desired assertions here

Обычно тестируемый объект не подвергается насмешке при юнит-тестировании. В этом случае, однако, требовалось вызвать участника внутри субъекта, который необходимо настроить так, чтобы он вел себя как нужно. Что можно сделать, переопределив его в производном классе. То же самое можно было бы сделать вручную без фальшивого фреймворка, но он упрощает настройку.

...