Модульное тестирование локальных и глобальных ресурсов в asp.net mvc

StackOverflow https://stackoverflow.com/questions/1025878

Вопрос

У меня есть класс, который обертывает GetGlobalResourceObject и GetLocalResourceObjet, чтобы их можно было легко использовать в MVC.Затем классы проверки модели динамически загружают сообщения об ошибках из файлов ресурсов.Проблема в модульном тестировании.В коде используется «~/», и хотя при запуске решения все работает правильно, я не могу понять, как выполнить модульные тесты, поскольку всегда получаю следующую ошибку «System.Web.HttpException:Относительный виртуальный путь приложения «~/» не может быть сделан абсолютным, поскольку путь к приложению неизвестен».

Ниже приведен код, который генерирует исключение и используется для оценки выражения и возврата объекта глобального ресурса.

Private Function GetExpressionFields(ByVal expression As String) As ResourceExpressionFields
    Return GetExpressionFields(expression, "~/")
End Function

Private Function GetExpressionFields(ByVal expression As String, ByVal path As String) As ResourceExpressionFields
    Dim context As New ExpressionBuilderContext(path)
    Dim resource_builder As New ResourceExpressionBuilder()
    Dim fields As ResourceExpressionFields
    fields = DirectCast(resource_builder.ParseExpression(expression, GetType(String), context), ResourceExpressionFields)
    Return fields
End Function

Есть идеи, как протестировать этот и другой код, использующий файлы ресурсов?

Это было полезно?

Решение

Я выбрал немного другой подход. Я использую файлы ресурсов вне каталогов App_ *, и в этом случае IDE добавит в файл пользовательский инструмент для создания строго типизированной оболочки для ресурсов, которые работают в любом месте решения, в том числе в представлениях, и ведут себя во время модульных тестов: http://odetocode.com/Blogs/scott/archive/ 2009/07/15 / 13211.aspx

Это не точный ответ на ваш вопрос, но я считаю, что заставить ресурсы App_ * правильно вести себя в любых условиях было довольно трудоемко.

Другие советы

Вы можете создать свойство в своем классе ResourceExtensions, например bool IsInTestScope, а затем в своем тестовом классе установить для него значение true, а внутренний метод, который возвращает локализованный текст, делает что-то вроде этого:

общедоступный статический строковый ресурс (этот контроллер контроллера, строковое выражение, объект params [] args)

{

если (!IsInTestScope)

{

Поля ResourceExpressionFields = GetResourceFields(выражение, "~/");

вернуть GetGlobalResource(поля, аргументы);

}

вернуть строку.Пусто;

}

Я нашел подход для тестирования кода, который использует ресурсы внутри каталогов App_ *. Я описал свое решение в своем блоге текст ссылки

scroll top