Модульное тестирование метода UpdateModel в MVC 3.0 - PullRequest
1 голос
/ 05 декабря 2010

Обновлено

Недавно я изменил представление, чтобы публиковать на своем контроллере объект json, а не форму коллекции.

Чтобы заставить модульный тест для этого контроллера работать, мы устанавливаем провайдер formvalue на объект словаря, чтобы метод UpdateModel не выбрасывал nre.

Полученный ниже модульный тест, однако, просто не подходит для правильной работы.Любое понимание того, как переделать это, будет с благодарностью.

    [HttpPost]
    public ActionResult ThemeContent(content model)
    {
        if (ModelState.IsValid)
        {
            var content = _contentRepository.GetContent(model.id);
            if (content == null)
            {
                content = new content();
                UpdateModel(content);
                _contentRepository.Add(content);
                _contentRepository.Save();
            }
            else
            {
                UpdateModel(content);
                _contentRepository.Save();
            }

            return Json(new
            {
                redirectUrl = Url.Action("index", "success", new {id = content.id}),
                isRedirect = true
            });
        }

        string errorMessage = "{";

        foreach (var key in ModelState.Keys)
        {
            var error = ModelState[key].Errors.FirstOrDefault();
            if (error != null)
            {
                if (errorMessage != "{")
                {
                    errorMessage += ",";
                }
                errorMessage += (char) 34 + "#" + key + (char) 34 + ":" + (char) 34 + error.ErrorMessage + (char) 34;
            }
        }

        errorMessage += "}";

        return Json(new
        {
            Message = errorMessage,
            isRedirect = false
        });

    }

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Обновлено, так как мы неправильно использовали метод updatemodel.

       //setup
        var fakeContent = new content
        {
            address1 = "123 test street"
        };

        _controller.Url = new UrlHelper(
            new RequestContext(
                _controller.HttpContext, new RouteData()
                ),
            new RouteCollection()
            );

        //execute
        var result = _controller.ThemeContent(fakeContent) as JsonResult();

        //assert
        Assert.AreEqual("123 test street", _content.address1);
0 голосов
/ 06 декабря 2010

Вам необходимо смоделировать контекст контроллера в вашем модульном тесте, если действие контроллера, которое вы пытаетесь протестировать, основано на нем. Я настоятельно рекомендую вам взглянуть на MVCContrib.TestHelper , который упростил бы задачу насмешки этого контекста и сделал ваши юнит-тесты более элегантными.

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