тестирование контроллера в asp.net mvc - PullRequest
0 голосов
/ 19 мая 2010

Я хотел бы проверить правильность представленного DTO. Это голая основа действия контроллера по созданию:

[AcceptVerbs(HttpVerbs.Post)]
        public RedirectToRouteResult Create(SomeDTO SomeDTO)
        {
            SomeObject SomeObject = null;

            try
            {
SomeObject = this.RepositoryService.getSomeObjectRepository().Create(SomeDTO, this.RepositoryService);
            }
            catch (BrokenRulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "Model");
            }
            catch (Exception e)
            {
                ModelState.AddModelError("Exception", e.Message);
            }

            TempData["ViewData"] = ViewData;
            TempData["SomeDTO "] = SomeDTO;

            return ModelState.IsValid ? RedirectToAction("SomeObjectDetail", new { Id = SomeObject.Id }) : RedirectToAction("Form");
        }

Механика, хотя и не имеет отношения к делу, такова: у меня есть строго типизированная view = форма, которая отправляет dto для этого действия, которое либо возвращает форму, либо страницу сведений о созданном объекте.

Я хотел бы провести модульное тестирование на предмет наличия в модели определенных комбинаций ключ / сообщение об ошибке с некоторым неверным значением dto. Кто-то делал подобные вещи? Любые указатели будут очень признательны.

Спасибо.

С наилучшими пожеланиями,

Christian

1 Ответ

1 голос
/ 19 мая 2010

В вашем случае, я не думаю, что вы действительно хотите проверить состояние модели. Скорее, вы должны просто использовать тестовый набор, чтобы вызвать правильное / неправильное состояние модели, а затем проверить, что соответствующий результат возвращается при определенных условиях. Вы можете использовать отдельные тесты для проверки различных условий, при которых модель является действительной / недействительной, однако, если вы используете DataAnnotations, я не вижу особого смысла в тестировании, чтобы они и инфраструктура привязки модели работали правильно. Предположительно Microsoft уже сделала это.

Оригинал, основанный на (ошибочном) предположении, что ViewResult возвращался

Я думаю, что-то вроде этого.

[TestMethod]
public void TestCreate()
{
     // set up

    var result = Create( invalidDTO ) as ViewResult;

    var modelState = result.ViewData.ModelState;

    Assert.IsFalse( modelState.IsValid );

    var errors = modelState.Errors;

    Assert.AreEqual( 1, errors.Count );
    Assert.AreEqual( errors[0].ErrorMessage, "some error message" );
}
...