App_GlobalResources не загружается в модульном тесте - PullRequest
17 голосов
/ 11 ноября 2010


У меня есть метод модульного тестирования, который проверяет метод действия контроллера.Метод действия использует файл ресурсов для получения статического сообщения.

 message = Resources.MyResource.MemberNotVerified;

Однако в этой строке выдается исключение: -

"Не удалось загрузить файл или сборку App_GlobalResources или одну из ее зависимостей. Система не может найти файлуказанный. ":" App_GlobalResources "System.IO.IOException {System.IO.FileNotFoundException}

Я попытался скопировать весь файл ресурсов в моем тестовом проекте, но это не удалось.
Любая идеядрузья.

Ответы [ 3 ]

21 голосов
/ 11 ноября 2010

За кулисами App_GlobalResources использует HttpContext.GetGlobalResourceObject

Конечно, в модульных тестах нет HttpContext (если только вы не издеваетесь над ним).

Если вы были так склонны насмехаться над этим, у Фила Хаака есть достойный пост здесь .

Существует еще одно решение: переместить файлы RESX из обычного каталога.

Скотт Аллен имеет сообщение на эту тему здесь .

4 голосов
/ 10 ноября 2015

Альтернативный подход - изменить тип файла ресурсов, который вы генерируете.

Я ожидаю, что есть другие способы его настройки, но мы установили следующие параметры в свойствах файла (щелкните правой кнопкой мыши файл в обозревателе решений и выберите свойства):

  • Действие построения: встроенный ресурс
  • Копировать в выходной каталог: не копировать
  • Пользовательский инструмент: PublicResXFileCodeGenerator
  • Ресурсы: Ресурсы
1 голос
/ 21 февраля 2019

Вот решение, которое не требует изменений, так как оно генерирует сборку с именем App_GlobalResources.dll со всеми вложенными ресурсами, как ожидают тесты.

Просто вызовите его из метода, отмеченногоатрибут AssemblyInitialize, и он будет запущен только один раз перед началом всех тестов:

public static void GenerateResourceAssembly()
{
    var testExecutionFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

    var solutionRootPath = "PATH_TO_YOUR_SOLUTION_ROOT";

    //Somewhere similar to C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
    var pathResgen = "PATH_TO_RESGEN.EXE"; 

    //You may need to adjust to the path where your global resources are
    var globalResourcesPath = Path.Combine(solutionRootPath, @"Web\App_GlobalResources");

    var parameters = new CompilerParameters
    {
        GenerateExecutable = false,
        OutputAssembly = "App_GlobalResources.dll"
    };

    foreach (var pathResx in Directory.EnumerateFiles(globalResourcesPath, "*.resx"))
    {
        var resxFileInfo = new FileInfo(pathResx);

        var filename = resxFileInfo.Name.Replace(".resx", ".resources");

        var pathResources = Path.Combine(testExecutionFolder, "Resources." + filename);

        var startInfo = new ProcessStartInfo
        {
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = Path.Combine(pathResgen, "resgen.exe"),
            Arguments = string.Format("\"{0}\" \"{1}\"", pathResx, pathResources)
        };

        using (var resgen = Process.Start(startInfo))
        {
            resgen.WaitForExit();
        }

        parameters.EmbeddedResources.Add(pathResources);
    }

    CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...