Tôi có một bộ điều khiển trong C # bằng cách sử dụng khung công tác ASP.Net MVC
public class HomeController:Controller{
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
//do some ajaxy stuff
}
return View("Index");
}
}
Tôi có một số mẹo về chế giễu và hy vọng sẽ kiểm tra mã với các điều sau đây và RhinoMocks
var mocks = new MockRepository();
var mockedhttpContext = mocks.DynamicMock<HttpContextBase>();
var mockedHttpRequest = mocks.DynamicMock<HttpRequestBase>();
SetupResult.For(mockedhttpContext.Request).Return(mockedHttpRequest);
var controller = new HomeController();
controller.ControllerContext = new ControllerContext(mockedhttpContext, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
Tuy nhiên tôi vẫn nhận được lỗi này:
Hệ thống ngoại lệ.ArgumentNullException: System.ArgumentNullException: Giá trị không thể rỗng. Tên tham số: request tại System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest (yêu cầu httpRequestBase)
Vì Request
đối tượng trên bộ điều khiển không có setter. Tôi đã cố gắng để thử nghiệm này hoạt động đúng bằng cách sử dụng mã được đề xuất từ câu trả lời bên dưới.
Điều này đã sử dụng Moq thay vì RhinoMocks và khi sử dụng Moq tôi sử dụng cách sau cho cùng một bài kiểm tra:
var request = new Mock<HttpRequestBase>();
// Not working - IsAjaxRequest() is static extension method and cannot be mocked
// request.Setup(x => x.IsAjaxRequest()).Returns(true /* or false */);
// use this
request.SetupGet(x => x.Headers["X-Requested-With"]).Returns("XMLHttpRequest");
var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);
var controller = new HomeController(Repository, LoginInfoProvider);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
nhưng nhận được lỗi sau:
Hệ thống ngoại lệ.ArgumentException: System.ArgumentException: Thiết lập không hợp lệ trên một thành viên không thể ghi đè: x => x.Headers ["X-Requested-With"] tại Moq.Mock.Throw IfCantOverride (Thiết lập biểu thức, phương thứcInInfo)
Một lần nữa, có vẻ như tôi không thể đặt tiêu đề yêu cầu. Làm cách nào để đặt giá trị này, trong RhinoMocks hoặc Moq?