代码之家  ›  专栏  ›  技术社区  ›  Kirschstein

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

  •  9
  • Kirschstein  · 技术社区  · 16 年前

    我的一些控制器操作需要使用不同的视图结果来响应,这取决于它们是否由Ajax请求调用。目前,我正在使用 IsAjaxRequest() 方法检查此项。在单元测试期间调用此方法时,它将引发 ArgumentNullException 因为HTTP上下文丢失。

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

    2 回复  |  直到 10 年前
        1
  •  12
  •   Mark Seemann    16 年前

    如果您为HTTP上下文提供一个双重测试,它会有帮助吗?

    可以这样做:

    var httpCtxStub = new Mock<HttpContextBase>();
    
    var controllerCtx = new ControllerContext();
    controllerCtx.HttpContext = httpCtxStub.Object;
    
    sut.ControllerContext = controllerCtx;
    

    在哪里? sut 表示正在测试的系统(SUT),即要测试的控制器。

    此示例使用moq。

        2
  •  3
  •   Ghominejad    10 年前

    使用 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;
        }
    }
    
    推荐文章