Необработанное исключение MethodAccessException с использованием Moles и xUnit.net для запуска модульных тестов - PullRequest
1 голос
/ 13 марта 2012

У меня есть проект модульного тестирования в Visual Studio 2010 (.NET 4), который использует платформу тестирования xUnit.net, Moq и платформу Moles Isolation для создания заглушек статических методов.Я использую xUnit версии 1.9 на 64-битной машине.

Для запуска тестов из командной строки я использую следующую команду:

moles.runner.exe Project.Tests.dll /runner:xunit.console.clr4.exe

Однако каждый раз я получаю следующее исключение:

инструментарий ... запущен консольный тестер xUnit.net (64-разрядная версия .NET 4.0.30319.1) Copyright(C) 2007-11 Корпорация Майкрософт.

Необработанное исключение: System.MethodAccessException: попытка прозрачным методом безопасности «Xunit.ConsoleClient.Program.Main (System.String [])» для доступа к критическому методу безопасности. System.AppDomain.add_UnhandledException (System.UnhandledExceptionEventHandler) 'не удалось.в Xunit.ConsoleClient.Program.Main (String [] args) в Microsoft.Moles.Runner.MolesRunner.RunnerRunner.Run (строковый бегун, String [] args) в Microsoft.Moles.Runner.MolesRunner.RunnerRunner.Run (строковый бегун, String [] args) в Microsoft.Moles.Runner.MolesRunner.LaunchRunnerEntryPoint (параметры MolesRunnerOptions) в Microsoft.Moles.Runner.MolesRunner.RunnerMain (String [] args) в Microsoft.Moles.Runner.Program.Main (строка)args)

Похоже, исключение исходит от xUnit;Тем не менее, я могу запустить тесты, используя xunit.console.clr4.exe самостоятельно без проблем.Сбой возможен только при использовании консоли xUnit от бегуна Moles.

Я нашел это в сообщении на форуме:

В среде .NET 4 правила прозрачности безопасности предотвращают любую прозрачность безопасностикод от вызова в критический код безопасности.

Что можно проверить, чтобы определить причину этой ошибки?Есть ли параметр безопасности, который мне нужно изменить, чтобы предотвратить это?

Примечание: У меня также точно такая же проблема на 32-разрядной рабочей станции.

Обновление: Я решил загрузить код с http://xunit.codeplex.com/SourceControl/changeset/changes/600246119dca и отладить себя.В проекте xunit.console (выход которого - exe, вызываемый из бегуна Moles), основной поток выполнения выглядит следующим образом:

[STAThread]
public static int Main(string[] args)
{
    Console.WriteLine("xUnit.net console test runner ({0}-bit .NET {1})", 
        IntPtr.Size * 8, Environment.Version);
    Console.WriteLine("Copyright (C) 2007-11 Microsoft Corporation.");

    if (args.Length == 0 || args[0] == "/?")
    {
        PrintUsage();
        return -1;
    }

    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

    try
    {
        CommandLine commandLine = CommandLine.Parse(args);

        int failCount = RunProject(commandLine.Project, 
            commandLine.TeamCity, commandLine.Silent);

        if (commandLine.Wait)
        {
            Console.WriteLine();
            Console.Write("Press any key to continue...");
            Console.ReadKey();
            Console.WriteLine();
        }

        return failCount;
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine();
        Console.WriteLine("error: {0}", ex.Message);
        return -1;
    }
    catch (BadImageFormatException ex)
    {
        Console.WriteLine();
        Console.WriteLine("{0}", ex.Message);
        return -1;
    }
}

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

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

Я закомментировал эту строку, встроенную xunit.console.exe и попытался использовать его в качестве аргумента / runner при повторном запуске Moles runner.На этот раз исключение не было выдано.

Я все еще в растерянности относительно того, почему возникает исключение безопасности в этой строке при вызове из moles.runner.exe, но не при запуске консоли xUnit с помощьюсам по себе.

1 Ответ

1 голос
/ 04 апреля 2012

Компиляция из последнего исходного кода из CodePlex выполняется без исключения MethodAccessException.

...