2010-05-24 2 views
2

Я пытаюсь проверить/спецификацию следующего метода действияПочему этот тест не прошел?

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?

+0

The ThenIt является своего рода фанки. Какая структура тестирования? – Dann

+0

@burnt_hand, 'ThenIt' (как указано в вопросе) просто псевдоним для' It' в Machine.Specifications (MSpec), чтобы избежать конфликтов с 'Moq.It'. –

ответ

2

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

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

Я конечно нужен

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

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