Контроллеры модульного тестирования с расширениями URL - PullRequest
2 голосов
/ 17 января 2012

Недавно я изменил большинство своих контроллеров, чтобы использовать вспомогательные расширения Url вместо RedirectToAction и т. Д .:

public ActionResult Create(CreateModel model)
{
    // ...
    return Redirect(Url.Home());
}

В настоящее время мои модульные тесты ломаются с исключениями NullReference.Как правильно смоделировать / заглушить UrlHelper, чтобы я мог снова запустить мои модульные тесты?

Редактировать:

Мое расширение Url выглядит так:

public static class UrlHelperExtensions
{
    public static string Home(this UrlHelper helper)
    {
        return helper.RouteUrl("Default");
    }
}

Мой модульный тест просто тестирует, чтобы убедиться, что они перенаправлены на правильную страницу:

// Arrange
var controller = new HomeController();

// Act
var result = controller.Create(...);

// Assert
// recalling the exact details of this from memory, but this is what i'm trying to do:
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
Assert.AreEqual(((RedirectToRouteResult)result).Controller, "Home");
Assert.AreEqual(((RedirectToRouteResult)result).Action, "Index");

В настоящее время происходит, когда я вызываю Url.Home (), но получаю ошибку нулевой ссылки.Я попытался установить свойство Url с новым UrlHelper, но оно все равно получает исключение нулевой ссылки.

1 Ответ

1 голос
/ 27 января 2012

Я думаю, что вам лучше абстрагироваться от ваших расширений, например:

public interface IUrls
{
   string Home();
}

public class Urls : IUrls
{
   public string Home()
   {
       //impl
   }
}

Затем конструктор внедрит это, где это необходимо, тогда вы можете легко заглушить 'IUrls' для ваших тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...