Почему этот тест не проходит?

Я пытаюсь проверить/указать следующий метод действия

public virtual ActionResult ChangePassword(ChangePasswordModel model)
{
    if (ModelState.IsValid)
    {
        if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
        {
            return RedirectToAction(MVC.Account.Actions.ChangePasswordSuccess);
        }
        else
        {
            ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
        }
    }
    // If we got this far, something failed, redisplay form
    return RedirectToAction(MVC.Account.Actions.ChangePassword);
}

со следующей спецификацией MSpec:

public class When_a_change_password_request_is_successful : with_a_change_password_input_model
{
    Establish context = () =>
    {
        membershipService.Setup(s => s.ChangePassword(Param.IsAny<string>(), Param.IsAny<string>(), Param.IsAny<string>())).Returns(true);
        controller.SetFakeControllerContext("POST");
    };

    Because of = () => controller.ChangePassword(inputModel);

    ThenIt should_be_a_redirect_result = () => result.ShouldBeARedirectToRoute();
    ThenIt should_redirect_to_success_page = () => result.ShouldBeARedirectToRoute().And().ShouldRedirectToAction<AccountController>(c => c.ChangePasswordSuccess());
}

где with_a_change_password_input_model — это базовый класс, который создает экземпляр входной модели, настраивает макет для IMembershipService и т. д. Тест завершается неудачей на первом ThenIt (это просто псевдоним, который я использую, чтобы избежать конфликта с Moq...) со следующим описание ошибки:

Machine.Specifications.SpecificationException: должен иметь тип System.RuntimeType, но [null]

Но я возвращаю что-то — на самом деле, RedirectToRouteResult — в любом случае метод может завершиться! Почему MSpec считает, что результатом будет null?


person Tomas Aschan    schedule 24.05.2010    source источник
comment
The ThenIt выглядит довольно забавно. Что это за тестовая среда?   -  person Dan    schedule 24.05.2010
comment
@burnt_hand, ThenIt - это (как указано в вопросе) просто псевдоним для It в Machine.Specifications (MSpec), чтобы избежать конфликтов с Moq.It.   -  person Tomas Aschan    schedule 24.05.2010


Ответы (1)


Я нашел ответ. Вместо

Because of = () => controller.ChangePassword(inputModel);

мне конечно нужно

Because of = () => result = controller.ChangePassword(inputModel);

поскольку без установки значения result result, очевидно, будет null. Вздох.

person Tomas Aschan    schedule 24.05.2010