2009-12-11 3 views
9

Некоторые из моих действий с контроллером должны отвечать разными ViewResults в зависимости от того, были ли они вызваны запросом AJAX. В настоящее время я использую метод IsAjaxRequest() для проверки этого. Когда этот метод вызывается во время модульного теста, он выдает ArgumentNullException, потому что отсутствует контекст HTTP.Контроллер блока тестирования Действия, вызывающие IsAjaxRequest()

Есть ли способ издеваться/подделывать этот звонок? Или это знак, которым я должен проверять запрос AJAX другим способом?

+0

SO-Как протестировать AJAX submition в ASP.NET MVC? - http://stackoverflow.com/questions/1010900/how-to-test-an-ajax-submition-in-asp-net-mvc –

ответ

12

Помогло бы оно, если вы предоставите тестовое двойное соединение для HTTP-контекста?

Это можно сделать так:

var httpCtxStub = new Mock<HttpContextBase>(); 

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

sut.ControllerContext = controllerCtx; 

где sut представляет тестируемой системы (SUT), то есть контроллер вы хотите проверить.

В этом примере используется Moq.

3

Использование 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; 
    } 
} 
Смежные вопросы