Модульное тестирование локальных и глобальных ресурсов в asp.net mvc - PullRequest
1 голос
/ 22 июня 2009

У меня есть класс, который упаковывает 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

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

Ответы [ 3 ]

4 голосов
/ 17 июля 2009

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

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

0 голосов
/ 17 сентября 2010

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

0 голосов
/ 21 июля 2009

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

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

{

if (! IsInTestScope)

{

ResourceExpressionFields fields = GetResourceFields (expression, "~ /");

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

}

возвращаемая строка. Пусто;

}

...