未处理的MethodAccessException使用Moles和xUnit.net来运行单元测试

时间:2012-03-13 19:06:25

标签: unit-testing exception moles xunit.net

我在Visual Studio 2010(.NET 4)中有一个单元测试项目,该项目利用xUnit.net测试框架,Moq和Moles Isolation框架来生成静态方法的存根。我在64位计算机上使用xUnit 1.9版。

要从命令行运行测试,我使用以下命令:

  

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

但是,我每次都会收到以下异常:

  

检测...启动xUnit.net控制台测试运行器(64位.NET   4.0.30319.1)版权所有(C)2007-11 Microsoft Corporation。

     

未处理的异常:System.MethodAccessException:尝试安全性   透明方法'Xunit.ConsoleClient.Program.Main(System.String [])'   访问安全关键方法   'System.AppDomain.add_UnhandledException(System.UnhandledExceptionEventHandler)'   失败。在Xunit.ConsoleClient.Program.Main(String [] args)at   Microsoft.Moles.Runner.MolesRunner.RunnerRunner.Run(String runner,   String [] args)at   Microsoft.Moles.Runner.MolesRunner.RunnerRunner.Run(String runner,   String [] args)at   Microsoft.Moles.Runner.MolesRunner.LaunchRunnerEntryPoint(MolesRunnerOptions   选项)在Microsoft.Moles.Runner.MolesRunner.RunnerMain(String []   args)at Microsoft.Moles.Runner.Program.Main(String [] args)

看起来异常来自xUnit;但是,我可以单独使用xunit.console.clr4.exe运行测试而不会出现问题。它只在使用Moles runner的xUnit控制台时失败。

我在论坛帖子中找到了这个:

  

在.NET 4框架中,安全性透明度规则可以防止任何问题   安全透明代码调用安全关键代码。

我可以检查以确定此错误的原因?我需要更改安全设置以防止这种情况吗?

注意:我在32位工作站上也遇到了同样的问题。

更新:我决定从http://xunit.codeplex.com/SourceControl/changeset/changes/600246119dca下载代码并自行调试。在xunit.console项目中(其输出是从Moles运行器调用的exe),执行的主线程如下所示:

[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 ,并在再次执行Moles runner时尝试将其用作 / runner 参数。这一次,没有抛出异常。

我仍然不知道为什么在从moles.runner.exe调用时会在此行上抛出Security异常,但是当我单独运行xUnit控制台时则不行。

1 个答案:

答案 0 :(得分:1)

从CodePlex的最新源代码编译,无需MethodAccessException。