我在Visual Studio 2010(.NET 4)中有一个单元测试项目,它使用xUnit.net测试框架,Moq和Moles Isolation框架来生成存根静态方法。我在64位机器上使用xUnit 1.9版。未处理的MethodAccessException使用Moles和xUnit.net运行单元测试
要运行命令行的测试中,我使用下面的命令:
moles.runner.exe Project.Tests.dll /runner:xunit.console.clr4.exe
不过,我每次出现以下情况例外:
插装...开始xUnit.net控制台测试运行器(64位.NET 4.0.30319.1)版权所有(C)2007-11微软语料库灰。
未处理的异常:System.MethodAccessException:由安全 透明方法尝试 'Xunit.ConsoleClient.Program.Main(System.String [])' 访问安全临界方法 “System.AppDomain.add_UnhandledException(System.UnhandledExceptionEventHandler )' 失败。在Xunit.ConsoleClient.Program.Main(字串[] args)在 Microsoft.Moles.Runner.MolesRunner.RunnerRunner.Run(字符串转轮, 字串[] args)在 Microsoft.Moles.Runner.MolesRunner.RunnerRunner.Run (字符串转轮, 字串[] args)在 Microsoft.Moles.Runner.MolesRunner.LaunchRunnerEntryPoint在Microsoft.Moles.Runner在Microsoft.Moles.Runner.MolesRunner.RunnerMain(MolesRunnerOptions 选项)(字符串[] 参数)。 Program.Main(String [] args)
看起来异常来自xUnit;但是,我能够单独运行xunit.console.clr4.exe而没有问题。它仅在使用Moles runner的xUnit控制台时失败。
我发现这个在论坛的帖子:
在.NET框架4,安全tranparency规则防止任何 安全透明代码调用到安全关键代码。
我可以检查以确定此错误的原因是什么?是否有需要更改以防止出现的安全设置?
注:我在32位工作站上也有同样的问题。
更新:我决定从http://xunit.codeplex.com/SourceControl/changeset/changes/600246119dca下载代码并调试我自己。在xunit.console项目(输出是从痣亚军得到调用的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,并尝试使用它作为/runner参数时再次执行鼹鼠亚军。这一次,没有例外。
对于为什么从moles.runner.exe调用时在此行上抛出安全异常,但我自己运行xUnit控制台时仍然不知所措。
什么版本的xunit? 1.9(还是1.8?)改变了xunit强加的安全要求。看看codeplex网站。 – 2012-03-15 00:10:44
我在两台机器上都使用了1.9。我没有在发布说明中看到与Moles一起使用亚军,但我会继续寻找。这似乎是与Moles一起使用的特定问题,因为从xUnit控制台单独运行它们时,测试运行良好。 – 2012-03-15 17:33:10
我遇到了运行xUnit v1.9.0.1566的相同问题。该错误显示为gui和控制台运行者。 – AlGonzalez 2012-04-04 16:04:48