Как мне издеваться над другим методом, который вызывается в действии контроллера? - PullRequest
0 голосов
/ 03 сентября 2018

Здесь у меня есть один сценарий, в котором мне нужно вызвать другую функцию в моем действии контроллера для какой-либо цели ввода. как показано ниже.

public IActionResult Dashboard()
        {
            try
            {
                    var allStuds = repository.GetAllStudentss();
                    var result = getFirstClassResult(allStuds);
                    return View("Dashboard", result );                         
            }
            catch (Exception ex)
            {             
                return View();
            }
        }


 public List<DashboardViewModel> getFirstClassResult(List<DashboardViewModel> model)
        {
      return students.OrderByDescending(x=>x.ExamDate).ToList();
    }

вот код внутри моего кейса.

var controller = new StudentController(repositoryMock.Object, null, sessionManagerMock.Object);
    var date = new DateTime();
    var model= new List<DashboardViewModel>          
    controller.ControllerContext.HttpContext = GetHttpContext(CreateSessionMock(true), authenticationServiceMock);
    controller.TempData = new TempDataDictionary(controller.ControllerContext.HttpContext, Mock.Of<ITempDataProvider>());
    controller.Url = GetUrlHelper();
    contextMock.Setup(mock => mock.GetAllStudents()).Returns(model);
    var repository = new StudentRepository(factoryMock.Object);
    var res = repository.GetAllStudents();                
    var result = controller.Dashboard() as ViewResult;
    Assert.Equal("Dashboard", result.ViewName);

и вот я пишу тестовый пример, в котором мне нужно смоделировать getFirstClassResult(allStuds) метод. что я не могу сделать.

1 Ответ

0 голосов
/ 03 сентября 2018

Следующая строка убивает все и вводит невозможное для модульного тестирования изолированное прочное соединение между вашим контроллером и уровнем доступа к данным:

IUserRepository repo = new UserRepository();

Абсолютно никогда не пишите ничего подобного в любом приложении (не только в ASP.NET MVC). если вы напишите такой код, он всегда будет прерываться в вашем модульном тесте, и вы не сможете его протестировать.

Нельзя издеваться / юнит-тест.

Вы должны использовать инжектор конструктора, чтобы ослабить связь между вашими слоями:

public class UserController : Controller{
private readonly IUserRepository _repos;
public UserController(IUserRepository repo)
{
    _repos = repo;
}

public ActionResult Index()
{
    return RedirectToAction("Details");
}

public ActionResult Details()
{
    IQueryable<Business.Entities.User> users = _repos.GetAll();
    return View("Details", users);
}}

Теперь вы можете выполнить модульное тестирование изолированно, издеваясь:

   [Test]
   public void Details()
   {
Mock<IUserRepository> mockRepo = new Mock<IUserRepository>();
mockRepo.Setup(ur => ur.GetAll()).Returns(MockedGetAll());
var v = mockRepo.Object.GetAll();

var controller = new UserController(mockRepo.Object);
var result = controller.List() as ViewResult;
var model = result.ViewData.Model as IQueryable<User>;

Assert.AreEqual("List", result.ViewName);
Assert.IsNotNull(model);
Assert.Greater(model.Count(), 0);}

Очевидно, что теперь, когда ваш контроллер зависит от этого хранилища, вы можете использовать инфраструктуру DI для настройки ваших зависимостей.

Люди, которые не хотят использовать DI-фреймворк, часто пишут такой код и предоставляют 2 конструктора (один для модульного тестирования и один для реального приложения):

private readonly IUserRepository _repo;
public UserController(IUserRepository repo)
{
_repo = repo;
 }
 public UserController(): this(new UserRepository())
 {}

См. Также религия внедрения зависимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...