Asp.Net MVC Учебное пособие - PullRequest
1 голос
/ 06 апреля 2010

Я работаю с книгой Стива Сандерсона Pro ASP.NET MVC Framework и у меня возникли некоторые проблемы с двумя модульными тестами, которые приводят к ошибкам.

В приведенном ниже примере проверяется CheckOut ViewResult:

[AcceptVerbs(HttpVerbs.Post)]
public ViewResult CheckOut(Cart cart, FormCollection form)
{
        // Empty carts can't be checked out
        if (cart.Lines.Count == 0)
        {
            ModelState.AddModelError("Cart", "Sorry, your cart is empty!");
            return View();
        }

        // Invoke model binding manually
        if (TryUpdateModel(cart.ShippingDetails, form.ToValueProvider()))
        {
            orderSubmitter.SubmitOrder(cart);
            cart.Clear();
            return View("Completed");
        }
        else // Something was invalid
            return View();
}

со следующим модульным тестом

[Test]
public void Submitting_Empty_Shipping_Details_Displays_Default_View_With_Error()
{
    // Arrange
    CartController controller = new CartController(null, null);
    Cart cart = new Cart();
    cart.AddItem(new Product(), 1);
    // Act
    var result = controller.CheckOut(cart, new FormCollection {
        { "Name", "" }                                               
    });
    // Assert
    Assert.IsEmpty(result.ViewName);
    Assert.IsFalse(result.ViewData.ModelState.IsValid);
}

Я решил все проблемы, связанные с TryUpdateModel, путем обновления до ASP.NET MVC 2 (Release Candidate 2), и веб-сайт работает, как и ожидалось.

Связанные сообщения об ошибках:

Tests.CartControllerTests.Submitting_Empty_Shipping_Details_Displays_Default_View_With_Error: 
System.ArgumentNullException : Value cannot be null.
Parameter name: controllerContext

и более подробно

at System.Web.Mvc.ModelValidator..ctor(ModelMetadata metadata, ControllerContext controllerContext)
at System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
at System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
at System.Web.Mvc.Controller.TryUpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
at System.Web.Mvc.Controller.TryUpdateModel[TModel](TModel model, IValueProvider valueProvider)
at WebUI.Controllers.CartController.CheckOut(Cart cart, FormCollection form)

Кто-нибудь сталкивался с подобной проблемой или прошел тест?

1 Ответ

2 голосов
/ 06 апреля 2010

Вы должны смоделировать HttpContext контроллера для написания таких тестов. Библиотека MvcContrib делает это довольно просто.

Другой вариант, который я предпочитаю, это извлечь логику, выполненную TryUpdateModel, в пользовательский ModelBinder. Затем вы можете проверить логику вашего метода действия извлечения отдельно от логики, которая обновляет вашу модель. HttpContext не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...