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

时间:2009-12-11 18:14:30

标签: c# asp.net-mvc ajax unit-testing moq

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

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

2 个答案:

答案 0 :(得分:12)

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

这可以这样做:

var httpCtxStub = new Mock<HttpContextBase>();

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

sut.ControllerContext = controllerCtx;

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

此示例使用Moq。

答案 1 :(得分:3)

在MVC测试项目中使用moq

[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;
    }
}