Ответ 1
Предполагая стандартное действие загрузки файлов:
[HttpPost]
public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> files)
{
foreach (var file in files)
{
var filename = Path.Combine(Server.MapPath("~/app_data"), file.FileName);
file.SaveAs(filename);
}
return View();
}
вы можете проверить его следующим образом:
[Test]
public void Upload_Action_Should_Store_Files_In_The_App_Data_Folder()
{
// arrange
var httpContextMock = new Mock<HttpContextBase>();
var serverMock = new Mock<HttpServerUtilityBase>();
serverMock.Setup(x => x.MapPath("~/app_data")).Returns(@"c:\work\app_data");
httpContextMock.Setup(x => x.Server).Returns(serverMock.Object);
var sut = new HomeController();
sut.ControllerContext = new ControllerContext(httpContextMock.Object, new RouteData(), sut);
var file1Mock = new Mock<HttpPostedFileBase>();
file1Mock.Setup(x => x.FileName).Returns("file1.pdf");
var file2Mock = new Mock<HttpPostedFileBase>();
file2Mock.Setup(x => x.FileName).Returns("file2.doc");
var files = new[] { file1Mock.Object, file2Mock.Object };
// act
var actual = sut.UploadFile(files);
// assert
file1Mock.Verify(x => x.SaveAs(@"c:\work\app_data\file1.pdf"));
file2Mock.Verify(x => x.SaveAs(@"c:\work\app_data\file2.doc"));
}
Очевидно, что вся часть установки HttpContext должна быть выведена в класс reusable class, который можно было бы вызвать в фазе [SetUp]
вашего unit test подготовить макет контекста испытуемого и не повторять его в каждом unit test.