Проблемы T4MVC и тестирования с MvcContrib.TestHelpers со статическим связанным содержимым

Я пытаюсь написать несколько тестов для некоторого кода, написанного ранее, прежде чем я начну с ним возиться. Я сталкиваюсь с проблемами, когда метод контроллера ссылается на некоторые статические переменные, которые 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, чтобы разрешить модульное тестирование. Меня не волнует, действительно ли он получает правильный путь, я просто не хочу, чтобы он взорвался. Могу ли я сделать это из моего тестового метода? Без изменения кода для проверки, находится ли он в отладке в нетестовом проекте?

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


Хорошо, я заставил это работать с кодом, упомянутым в комментарии.

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

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


person nportelli    schedule 27.09.2011    source источник
comment
У меня такая же проблема. И это не имеет никакого смысла. Я устанавливаю делегата на свой собственный, но набор игнорируется. Я не могу понять, как статический делегат не может быть установлен во время выполнения.   -  person Jason Wicker    schedule 05.11.2011
comment
Я заставил это работать с T4MVCHelpers.ProcessVirtualPath = (s) =› ~/Content/Images; НО... это работает только тогда, когда тест запускается сам по себе, а не в группе со всеми другими тестами. Делает его каким-то бесполезным.   -  person nportelli    schedule 07.11.2011


Ответы (2)


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

person David Ebbo    schedule 30.09.2011
comment
Я думаю, что это мой вопрос, и я думал, что сделал, и это, похоже, не сработало. Я пока сдалась, но планирую вернуться. Я думаю, вы можете снова игнорировать меня и мой вопрос T4MVC, я почти уверен, что это просто все мое отсутствие тестирования и ASP MVC - person nportelli; 30.09.2011

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

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

    // TEST CODE

 }
person Jason Wicker    schedule 07.11.2011