2013-06-23 2 views
2

Я использую метод RedirectToAction для перенаправления пользователя в другую форму после того, как он заполнил регистрационную форму, и все проверки были переданы. Единственная проблема возникает при тестировании контроллера. Как проверить, что пользователь был успешно перенаправлен в нужную форму?Как протестировать этот контроллер?

Контроллер:

[HttpPost] 
public ActionResult Register(ClientViewModel clientViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //filling db object 
       if (license.HasValue) 
       { 
        return RedirectToAction("RegisterSuccess"); 
       } 
    } 
    return View(clientViewModel); 
} 

Метод испытания:

public void Register_WithUniqueUsernameAndEmail_ReturnsRegistrationSuccessful() 
{ 
    // Arrange: 
    var mock = new Mock<IAccountFacade>(); 
    mock.Setup(/*mocking methods*/); 
    var controller = new AccountController(mock.Object); 
    var context = new ControllerContext(); 
    var fakeClientViewModel = new ClientViewModel 

    // Act: 
    var result = controller.Register(fakeClientViewModel); 
    // how do I get the name of result or something similar? 

    // Assert: ??? 
} 

Я использую Moq и NUnit для тестирования. Если контроллер просто вернул представление, я думаю, что у меня не было бы проблем, но с помощью метода RedirectToAction я не могу найти способ получить доступ к фактическому URL-адресу или маршруту формы перенаправления. Какие-либо предложения?

ответ

1

Вы должны указать свою переменную result на тип, возвращаемый RedirectToAction, что составляет RedirectToRouteResult. Затем вы можете проверить его блок следующим образом:

var result = (RedirectToRouteResult)controller.Register(fakeClientViewModel); 

Assert.AreEqual("ExpectedActionName", result.RouteValues["action"]); 
Assert.AreEqual("ExpectedControllerName", result.RouteValues["controller"]); 
+0

работает как шарм. Благодарю. –

0

Ваш пример не отражает контроллер/действие, однако тестовые утверждения будет выглядеть примерно так:

// act 
var result = someController.SomeAction() as RedirectToRouteResult; 

// assert 
Assert.AreEqual("ExpectedRoute", result.RouteValues["action"]); 
Assert.AreEqual("ExpectedController", result.RouteValues["controller"]); 
+0

Да, спасибо, и извините, я считаю, что отредактированный код немного более ясен. Фактически, когда я использую ключевое слово as, результат равен нулю, не знаю, почему ... –