Пустое исключение при заполнении строки запроса с помощью фреймворка - PullRequest
1 голос
/ 06 января 2011

Существует простой контроллер, который в конструкторе его читает строка запроса.

 public class ProductController : Controller
 {
    parivate string productName;

    public ProductController()
    {
       productName = Request.QueryString["productname"];
    }

    public ActionResult Index()
    {
        ViewData["Message"] = productName;

        return View();
    }
 }

Также у меня есть функция в модульном тесте, которая создает экземпляр этого контроллера, и я заполняю строку запроса объектом Mock, как показано ниже.

[TestClass]
public class ProductControllerTest
{
    [TestMethod]
    public void test()
    {
        // Arrange 
        var querystring = new System.Collections.Specialized.NameValueCollection { { "productname", "sampleproduct"} };
        var mock = new Mock<ControllerContext>();
        mock.SetupGet(p => p.HttpContext.Request.QueryString).Returns(querystring);

        var controller = new ProductController();
        controller.ControllerContext = mock.Object;

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


        // Assert
        Assert.AreEqual("Index", result.ViewName);
    }
}

К сожалению, Request.QueryString ["productname"] является нулем в конструкторе ProductController, когда я запускаю тестовый модуль.

Есть ли способ заполнить строку запроса с помощью насмешки и получить ее в конструкторе элемента управления?

1 Ответ

4 голосов
/ 06 января 2011

Существует простой контроллер, который в конструкторе его читает строка запроса.

Вы не должны этого делать, и такой контроллер не должен существовать. Контекст контроллера еще не инициализирован в конструкторе, и он потерпит неудачу не только для модульного теста, но и для реального.

Вам следует использовать метод Initialize , когда у вас есть доступ к контексту запроса.

...