单元测试控制器调用IsAjaxRequest()的操作

Kir*_*ein 9 c# ajax asp.net-mvc unit-testing moq

我的一些控制器操作需要响应不同的ViewResults,具体取决于它们是否被AJAX请求调用.目前,我正在使用该IsAjaxRequest()方法来检查这一点.在单元测试期间调用此方法时,它会抛出一个ArgumentNullException因为缺少HTTP上下文.

有没有办法模拟/伪造这个电话?或者这是一个标志,我应该用另一种方式检查AJAX请求?

Mar*_*ann 12

如果您为HTTP上下文提供Test Double会有帮助吗?

这可以这样做:

var httpCtxStub = new Mock<HttpContextBase>();

var controllerCtx = new ControllerContext();
controllerCtx.HttpContext = httpCtxStub.Object;

sut.ControllerContext = controllerCtx;
Run Code Online (Sandbox Code Playgroud)

其中sut代表被测系统(SUT),即您要测试的控制器.

此示例使用Moq.


Gho*_*jad 5

moq在 MVC 测试项目中使用库

[TestClass]
public class HomeControllerTest
{
    [TestMethod]
    public void Index()
    {
        // Arrange
        HomeController controller = new HomeController();
        controller.injectContext();
        // controller.injectContext(ajaxRequest: true);

        // Act
        ViewResult result = controller.Index() as ViewResult;

        // Assert
        Assert.IsNotNull(result);
    }
}


public static class MvcTestExtensions
{
    public static void injectContext(this ControllerBase controller, bool ajaxRequest = false)
    {
        var fakeContext = new Mock<ControllerContext>();
        fakeContext.Setup(r => r.HttpContext.Request["X-Requested-With"])
            .Returns(ajaxRequest ? "XMLHttpRequest" : "");
        controller.ControllerContext = fakeContext.Object;
    }
}
Run Code Online (Sandbox Code Playgroud)