Как смоделировать HttpPostedFileBase, используя moq в ASP.NET MVC - PullRequest
0 голосов
/ 24 января 2019

Метод моего контроллера:

[HttpPost]
public ActionResult CreateTeam(Team model, HttpPostedFileBase upload)
{
     if (ModelState.IsValid)
     {
          if (upload != null)
          {
              // Get the file
              string fileName = System.IO.Path.GetFileName(upload.FileName);
              // Save the file in file сохраняем файл в папку Files в проекте
              upload.SaveAs(Server.MapPath("~/Images/NBAlogoImg/" + fileName));
          }
         teamRepository.CreatTeam(model);

         return RedirectToAction("Index", "Player");
    }

    return View(model);
}

Мой метод тестирования без загрузки изображения:

[TestMethod]
public void CanCreateTeam()
{
        //Arrange
        Mock<ITeamRepository> teamsMock = new Mock<ITeamRepository>();
        Team newTeam = new Team()
        {
            Id = 0,
            Name = "Chicago Bulls",
            Path = "CHI.jpg",
        };
        TeamController controller = new TeamController(teamsMock.Object);
        //Action
        ActionResult result = controller.CreateTeam(newTeam);
        teamsMock.Verify(m => m.CreatTeam(newTeam));
        //Assert
        Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
}

Я понятия не имею, как сделать правильный модульный тест для этого действия. Однако действия работают без проблем.

Как в этом методе тестирования добавить функционал для проверки HttpPostedFileBase, который загружает изображение?

1 Ответ

0 голосов
/ 24 января 2019

Сначала обновите метод CreateTeam POST следующим образом, так как в строке upload.SaveAs(Server.MapPath("~/Images/NBAlogoImg/" + fileName)); есть проблема.

[HttpPost]
public ActionResult CreateTeam(Team model, HttpPostedFileBase upload)
{
     if (ModelState.IsValid)
     {
          if (upload != null)
          {
              // Get the file
              string fileName = System.IO.Path.GetFileName(upload.FileName);
              var fileUploadPath = Path.Combine(Server.MapPath("~/Images/NBAlogoImg/"),fileName);
              upload.SaveAs(fileUploadPath);
          }
         teamRepository.CreatTeam(model);

         return RedirectToAction("Index", "Player");
    }

    return View(model);
}

Затем напишите свой метод тестирования следующим образом:

[TestMethod]
public void CanCreateTeam()
{
    //Arrange
    Mock<ITeamRepository> teamRepositoryMock = new Mock<ITeamRepository>();
    Team newTeam = new Team()
    {
        Id = 0,
        Name = "Chicago Bulls",
        Path = "CHI.jpg",
    };


    var httpContextMock = new Mock<HttpContextBase>();
    var serverMock = new Mock<HttpServerUtilityBase>();
    serverMock.Setup(x => x.MapPath("~/Images/NBAlogoImg/")).Returns(@"c:\work\app_data");
    httpContextMock.Setup(x => x.Server).Returns(serverMock.Object);

    var fileMock = new Mock<HttpPostedFileBase>();
    fileMock.Setup(x => x.FileName).Returns("file1.pdf");

    TeamController controller = new TeamController(teamRepositoryMock.Object);
    controller.ControllerContext = new ControllerContext(httpContextMock.Object, new RouteData(), controller);

    //Act
    ActionResult result = controller.CreateTeam(newTeam , fileMock.Object);

    //Assert
    fileMock.Verify(x => x.SaveAs(@"c:\work\app_data\file1.pdf"));
    Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
}

Я проверил приведенный выше код в тестовом проекте, и он отлично работает.

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