Я пытаюсь проверить/спецификацию следующего метода действияПочему этот тест не прошел?
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 но [пустой]
Но я утра возвращение что-то - в самом деле, RedirectToRouteResult
- в каждом пути метод может прекратить! Почему MSpec считает результат null
?
The ThenIt является своего рода фанки. Какая структура тестирования? – Dann
@burnt_hand, 'ThenIt' (как указано в вопросе) просто псевдоним для' It' в Machine.Specifications (MSpec), чтобы избежать конфликтов с 'Moq.It'. –