我想在MVC單元測試中測試一個控制器方法。 對於我測試的控制器方法,我需要一個長度爲1的Request.Files []集合。 我想模擬Request.Files [],因爲我在控制器方法呈現的視圖上使用了文件上傳控件。 任何人都可以請建議如何在我的單元測試中模擬request.file集合。如何在MVC單元測試類中模擬Request.Files []?
感謝, 卡皮爾
我想在MVC單元測試中測試一個控制器方法。 對於我測試的控制器方法,我需要一個長度爲1的Request.Files []集合。 我想模擬Request.Files [],因爲我在控制器方法呈現的視圖上使用了文件上傳控件。 任何人都可以請建議如何在我的單元測試中模擬request.file集合。如何在MVC單元測試類中模擬Request.Files []?
感謝, 卡皮爾
你沒有提到你使用的是什麼嘲弄的框架,但這裏是你將如何與犀牛嘲笑做到這一點:
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(Request.Files.Count);
}
}
單元測試:
[TestMethod]
public void SomeTest()
{
// arrange
var controller = new HomeController();
var context = MockRepository.GenerateStub<HttpContextBase>();
var request = MockRepository.GenerateStub<HttpRequestBase>();
var files = MockRepository.GenerateStub<HttpFileCollectionBase>();
context.Stub(x => x.Request).Return(request);
files.Stub(x => x.Count).Return(5);
request.Stub(x => x.Files).Return(files);
controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);
// act
var actual = controller.Index();
// assert
Assert.IsInstanceOfType(actual, typeof(ViewResult));
var viewResult = actual as ViewResult;
Assert.IsInstanceOfType(viewResult.ViewData.Model, typeof(int));
Assert.AreEqual(5, viewResult.ViewData.Model);
}
備註:使用使用起訂量
[TestMethod]
public void SomeTest()
{
// arrange
var sut = new HomeController();
InitializeController(sut);
Files["test.txt"] = MockRepository.GenerateStub<HttpPostedFileBase>();
// act
var actual = sut.Index();
// assert
actual
.AssertViewRendered()
.WithViewData<int>()
.ShouldBe(1);
}
Scott Hanselman has a blog post covering this:此測試可以大大簡化特別的上下文嘲笑部分和斷言爲好。
謝謝Darin。我正在使用開源嘲諷框架「Moq」。 – 2010-04-26 13:24:29