T4MVC и тестирование с MvcContrib.TestHelpers проблемы со статическим связанным контентом - PullRequest
1 голос
/ 27 сентября 2011

Я пытаюсь написать несколько тестов вокруг некоторого кода, написанного ранее, прежде чем начать работать с ним.Я сталкиваюсь с проблемами, когда метод контроллера ссылается на некоторые статические переменные, которые T4MVC создает для изображений и ссылок.На самом деле это та же проблема, что и мой предыдущий вопрос здесь , но он не в конструкторе.

Проблема заключается в следующем коде:

 if (User.IsInRole("Rate Admin") || User.IsInRole("Administrator"))
        {
            _ratesViewData.ActionLinks = new List<CustomActionLink>
                                             {
                                                 new CustomActionLink("Edit",
                                                                      editPath + Resources.DelimeterHyphen,
                                                                      Links.Content.Images.openwhite_gif),
                                                 new CustomActionLink("Delete",
                                                                      statusPath + Resources.DelimeterHyphen,
                                                                      Links.Content.Images.openwhite_gif)
                                             };
        }

Проблема в Links.Content.Images.openwhite_gif, ниже в сгенерированном коде T4MVC он вызывает VirtualPathUtility.ToAbsolute из статического метода ProcessVirtualPath.Я не могу издеваться над ProcessVirtualPath или VirtualPathUtility.

Теперь в комментарии выше ProcessVirtualPath говорится, что он вызывается через делегат, чтобы можно было заменить его для модульного тестирования.Делегат:

 public static Func<string, string> ProcessVirtualPath = ProcessVirtualPathDefault;

Как заменить то, что вызывается для ProcessVirtualPath для обеспечения модульного тестирования.Мне все равно, если он действительно получит правильный путь, я просто не хочу, чтобы он взорвался.Могу ли я сделать это из моего метода испытаний?Без изменения кода, чтобы проверить, не отлажен ли он в не тестовом проекте?

Также связанный вопрос: каков наилучший метод для кода, подобного описанному выше?Где должен быть код для условий на основе разрешений?Или даже боевые ссылки.Я не уверен, почему они находятся в модели viewdata.


ОК. Я получил это для работы с кодом, упомянутым в комментарии.

T4MVCHelpers.ProcessVirtualPath = (s) => "~/Content/Images";

НО только когда тест выполняется индивидуально, любой тест, который нуждается в этом, не будет выполнен, если он будет выполнен с другим тестом, который использует класс TestControllerBuilder и не устанавливает его.Зачем?

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Возможно, я не до конца понимаю вопрос, но почему вы не можете просто установить T4MVCHelpers.ProcessVirtualPath каким-либо другим методом?

2 голосов
/ 08 ноября 2011

Я смог заставить это работать, если я установил делегат ProcessVirtualPath в статическом конструкторе в моем тестовом классе.

 public class BaseTest
 {
    static BaseTest()
    {
        T4MVCHelpers.ProcessVirtualPath = s => s.TrimStart('~');
    }

    // TEST CODE

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