Модульное тестирование локальных и глобальных ресурсов в asp.net mvc
-
06-07-2019 - |
Вопрос
У меня есть класс, который обертывает 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_ *. Я описал свое решение в своем блоге текст ссылки а> р>