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