C# 如何在ASP.NET MVC中使用moq模拟HttpPostedFileBase

C# 如何在ASP.NET MVC中使用moq模拟HttpPostedFileBase,c#,asp.net-mvc,moq,C#,Asp.net Mvc,Moq,我的控制器方法: [HttpPost] public ActionResult CreateTeam(Team model, HttpPostedFileBase upload) { if (ModelState.IsValid) { if (upload != null) { // Get the file string fileName = System.IO.Path.Get

我的控制器方法:

[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));
}
[TestMethod]
public void CanCreateTeam()
{
//安排
Mock teamsMock=新Mock();
团队新团队=新团队()
{
Id=0,
Name=“芝加哥公牛队”,
Path=“CHI.jpg”,
};
TeamController=新的TeamController(teamsMock.Object);
//行动
ActionResult=controller.CreateTeam(新团队);
验证(m=>m.CreatTeam(newTeam));
//断言
IsInstanceOfType(result,typeof(RedirectToRouteResult));
}
我不知道如何为此操作进行正确的单元测试。然而,这一行动正在顺利进行,没有任何问题


如何在此测试方法中添加上载图像的
HttpPostedFileBase
的测试函数?

首先更新
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));
}
[TestMethod]
public void CanCreateTeam()
{
//安排
Mock teamRepositoryMock=新建Mock();
团队新团队=新团队()
{
Id=0,
Name=“芝加哥公牛队”,
Path=“CHI.jpg”,
};
var httpContextMock=new Mock();
var serverMock=new Mock();
Setup(x=>x.MapPath(“~/Images/NBAlogoImg/”)。返回(@“c:\work\app_data”);
httpContextMock.Setup(x=>x.Server).Returns(serverMock.Object);
var fileMock=new Mock();
Setup(x=>x.FileName).Returns(“file1.pdf”);
TeamController=新的TeamController(teamRepositoryMock.Object);
controller.ControllerContext=新的ControllerContext(httpContextMock.Object,new RouteData(),controller);
//表演
ActionResult=controller.CreateTeam(newTeam,fileMock.Object);
//断言
验证(x=>x.SaveAs(@“c:\work\app\u data\file1.pdf”);
IsInstanceOfType(result,typeof(RedirectToRouteResult));
}

我已经在一个测试项目中检查了上面的代码,它工作得非常好。

这里没有单元测试。您刚刚创建了一些与MVC框架本身相关的脆弱的东西。“测试”对代码的工作方式有深入的了解,这意味着代码中的任何更改都将触发测试失败,测试本身需要更改以匹配新代码。这就是脆性试验的定义。您添加的内容越多,情况就越糟。@remk93,您检查过我更新的答案了吗?我将NullReferenceException,StackTrace:带到co
upload.SaveAs(Server.MapPath(“~/Images/NBAlogoImg/”+fileName))的这部分
和这个
ActionResult=controller.CreateTeam(newTeam,mockedImageFile)您也必须模拟upload.SaveAs()方法。我在测试中添加了相同的问题
mockedImageFile.SaveAs(controller.Server.MapPath(“~/Images/NBAlogoImg/”+mockedImageFile.FileName))测试失败Kay!没问题!我会在我身边试试我的。也许我以后会更新答案。