2

我有一套单元测试,如果我一起运行(使用 resharper)我会收到这个错误:

SetUp:System.TypeInitializationException:“FakeItEasy.Core.FakeScope”的类型初始化程序引发了异常。----> System.IO.FileLoadException:API 限制:程序集 'file:///C:\Users\abrown\Documents\Repos\ink.services.jetstar\My.Namespace.Tests.Unit\bin\Debug \My.Namespace.dll' 已从其他位置加载。它不能从同一 appdomain 中的新位置加载。

如果我单独运行它们,它们就会通过。

在异常的下方,它在这样的行上失败了:

[SetUp]
public void SetUp()
{
    _myFake = A.Fake<ISomething>();

编辑

如果我使用“标准”NUnit Test Runner,也会发生这种情况。

正如@david-arno 在评论中所说,通过更改 ReSharper 运行器中的设置,可以修复它(显然仅用于重新锐化)

为了完整起见,这是一个完整的堆栈跟踪

My.CompanyNamespace.ProjectName.Tests.Unit.DownloadAndStoreContentTests.gets_content_downloader_for_each_section_in_index:SetUp:System.TypeInitializationException:“FakeItEasy.Core.FakeScope”的类型初始化程序引发异常。----> System.IO.FileLoadException:API 限制:程序集 'file:///C:\Users\abrown\Documents\Repos\My.CompanyNamespace\My.CompanyNamespace.ProjectName.Tests.Unit\bin\Debug \My.CompanyNamespace.ProjectName.dll' 已从其他位置加载。它不能从同一 appdomain 中的新位置加载。

在 FakeItEasy.Core.FakeScope.get_Current() 在 FakeItEasy.IoC.DictionaryContainer.<>c_DisplayClass1 1.b 1.<Register>b__0(DictionaryContainer c) at FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) at FakeItEasy.ServiceLocator.Resolve[T]() at FakeItEasy.RootModule.<RegisterDependencies>b__3(DictionaryContainer c) at FakeItEasy.IoC.DictionaryContainer.<>c__DisplayClass1_0 (DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) 在 FakeItEasy.ServiceLocator.ResolveT 在 FakeItEasy。 RootModule.b_ 1a(DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.<>c _DisplayClass11.<Register>b__0(DictionaryContainer c) at FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) at FakeItEasy.ServiceLocator.Resolve[T]() at FakeItEasy.RootModule.<RegisterDependencies>b__19(DictionaryContainer c) at FakeItEasy.IoC.DictionaryContainer.<>c__DisplayClass11.b__0(DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) 在 FakeItEasy.ServiceLocator.ResolveT 在 FakeItEasy.A.FakeT 在 My.CompanyNamespace.ProjectName.Tests.Unit.DownloadAndStoreContentTests.SetUp() 在 c: \Users\abrown\Documents\Repos\My.CompanyNamespace\My.CompanyNamespace.ProjectName.Tests.Unit\DownloadAndStoreContentTests.cs:line 23 --FileLoadException at System.Reflection.RuntimeAssembly。在 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName (AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly stackCrawlMark & StackMarkAssembly, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean suppressSecurityChecks) IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean suppressSecurityChecks.RuntimeAs) 在 System.RefleInternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean for Introspection, Boolean suppressSecurityChecks, StackCrawlMark & stackMark) at System.Reflection.Assembly.ReflectionOnlyLoadFrom(String assemblyFile) at FakeItEasy.Core.ApplicationDirectoryAssembliesTypeCatalogue.GetAllAvailableAssemblies() at FakeItEasy FakeItEasy.ImportsModule.b 上的 Core.ApplicationDirectoryAssembliesTypeCatalogue..ctor()GetAllAvailableAssemblies() 在 FakeItEasy.Core.ApplicationDirectoryAssembliesTypeCatalogue..ctor() 在 FakeItEasy.ImportsModule.bGetAllAvailableAssemblies() 在 FakeItEasy.Core.ApplicationDirectoryAssembliesTypeCatalogue..ctor() 在 FakeItEasy.ImportsModule.b_1(DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.SingletonResolver 1.UnresolvedState.Resolve(DictionaryContainer container) at FakeItEasy.IoC.DictionaryContainer.<>c__DisplayClass11.b_ 0(DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) 在 FakeItEasy.ServiceLocator.ResolveT 在 FakeItEasy.ImportsModule.b _0(DictionaryContainer c)在 FakeItEasy.IoC.DictionaryContainer.SingletonResolver 1.UnresolvedState.Resolve(DictionaryContainer container) at FakeItEasy.IoC.DictionaryContainer.<>c__DisplayClass11.b_0 (DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) 在 FakeItEasy.ServiceLocator.ResolveT 在 FakeItEasy.ImportsModule.b _4[T](DictionaryContainer c) 在 FakeItEasy .IoC.DictionaryContainer.SingletonResolver1.UnresolvedState.Resolve(DictionaryContainer container) at FakeItEasy.IoC.DictionaryContainer.<>c__DisplayClass11.b__0(DictionaryContainer c) 在 FakeItEasy.IoC.DictionaryContainer.Resolve(Type componentType) 在 FakeItEasy.ServiceLocator.ResolveT 在 FakeItEasy.Core.FakeScope.RootScope..ctor() 在 FakeItEasy.Core.FakeScope..cctor()

4

1 回答 1

4

我认为这是因为:

  1. 在(或接近)启动时,FakeItEasy扫描其工作目录以查找可能包含扩展点的 DLL
  2. 您在不同的目录中有多个测试程序集,其中至少两个包含同一程序集的副本,并且
  3. 测试运行者在同一个 AppDomain 中运行每个测试程序集的测试

并行运行测试程序集的原因不是由于并行性,而是因为测试运行程序随后将在单独的 AppDomain 中运行程序集。

其他应该带来缓解的解决方法是在单独的 AppDomain 中运行程序集的测试(例如,使用 NUnit 的/domain=Multiple参数),甚至是单独的进程 ( /process=Multiple)。我希望许多测试运行者支持这些选项。我没有 ReSharper 8,但是

我们正在努力使 FakeItEasy 更能容忍加载程序集的失败。我在FakeItEasy 问题 189中添加了更多详细信息- 感谢提交。

更新上述问题 189 已在FakeItEasy 1.15.0中修复。从 NuGet 获取它或更高版本!

于 2013-11-03T01:04:19.693 回答