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:带到coupload.SaveAs(Server.MapPath(“~/Images/NBAlogoImg/”+fileName))的这部分
和这个ActionResult=controller.CreateTeam(newTeam,mockedImageFile)代码>您也必须模拟upload.SaveAs()方法。我在测试中添加了相同的问题mockedImageFile.SaveAs(controller.Server.MapPath(“~/Images/NBAlogoImg/”+mockedImageFile.FileName))代码>测试失败Kay!没问题!我会在我身边试试我的。也许我以后会更新答案。