Saya memiliki pengontrol di C # menggunakan kerangka ASP.Net MVC
public class HomeController:Controller{
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
//do some ajaxy stuff
}
return View("Index");
}
}
Saya mendapat beberapa tip tentang mengejek dan berharap untuk menguji kode dengan yang berikut dan 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);
Namun saya terus mendapatkan kesalahan ini:
Exception System.ArgumentNullException: System.ArgumentNullException: Nilai tidak boleh nol. Nama parameter: permintaan di System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest (permintaan HttpRequestBase)
Karena Request
objek pada pengontrol tidak memiliki setter. Saya mencoba agar tes ini berfungsi dengan baik dengan menggunakan kode yang disarankan dari jawaban di bawah ini.
Ini menggunakan Moq alih-alih RhinoMocks, dan dalam menggunakan Moq saya menggunakan yang berikut untuk tes yang sama:
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);
tetapi dapatkan kesalahan berikut:
Exception System.ArgumentException: System.ArgumentException: Penyiapan yang tidak valid pada anggota yang tidak dapat ditimpa: x => x.Headers ["X-Diminta-Dengan"] di Moq.Mock.ThrowIfCantOverride (Penyiapan Ekspresi, penyiapan Metode, MetodeInfo metodeInfo)
Sekali lagi, sepertinya saya tidak bisa mengatur header permintaan. Bagaimana cara menetapkan nilai ini, dalam RhinoMocks atau Moq?