我在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控制台时则不行。
答案 0 :(得分:1)
从CodePlex的最新源代码编译,无需MethodAccessException。