Moq单元测试:Moq.Proxy.CastleProxyFactory上的System.TypeInitializationException

时间:2016-09-13 12:53:11

标签: c# moq castle-windsor

我正在使用Moq作为单元测试的模拟库。

似乎很难找到Castle Windsor图书馆,因为它给了我这个错误:

System.TypeInitializationException : Une exception a été levée par l'initialiseur de type pour 'Moq.Mock`1'.
  ----> System.TypeInitializationException : Une exception a été levée par l'initialiseur de type pour 'Moq.Proxy.CastleProxyFactory'.
  ----> System.IO.FileNotFoundException : Impossible de charger le fichier ou l'assembly 'Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' ou une de ses dépendances. Le fichier spécifié est introuvable.
   à Moq.Mock`1.<InitializeInstance>b__24_0()
   à Moq.PexProtector.Invoke(Action action)
   à Moq.Mock`1.InitializeInstance()
   à Moq.Mock`1.OnGetObject()
   à Moq.Mock.GetObject()
   à Moq.Mock.get_Object()
   à Moq.Mock`1.get_Object()
   à TecLib.Common.Tests.Infrastructure.CqrsRepositoryBaseTest.SetUp() dans C:\Users\Ludovic\Documents\Visual Studio 2015\Projects\TEC2\TecLib.Common.Tests\Infrastructure\CqrsRepositoryBaseTest.cs:ligne 38
--TypeInitializationException
   à Moq.Proxy.CastleProxyFactory..ctor()
   à Moq.Mock`1..cctor()
--FileNotFoundException
   à Moq.Proxy.CastleProxyFactory..cctor()

这是触发错误的测试之一。代码工作得非常好。这是Moq图书馆引发的错误,因为它似乎无法找到Castle Windsor图书馆。

    [SetUp]
    public void SetUp()
    {
        _eventStore = new Mock<IEventStore>();
        _eventDispatcher = new Mock<IEventDispatcher>();
        _entityFactory = new Mock<IEntityFactory>();

        _repository = new CqrsAddressRepository(_entityFactory.Object, _eventStore.Object, _eventDispatcher.Object);
        _addressInfo1 = new AddressInfo("400 chemin Jette", "", "", "Farnham", "J0J2B0", "Quebec", "Canada");
        _addressInfo2 = new AddressInfo("322 rue Principale E", "", "", "Farnham", "J2N1L7", "Quebec", "Canada");
    }

这些是我项目的包

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Castle.Core" version="3.3.3" targetFramework="net461" />
  <package id="Castle.Windsor" version="3.3.0" targetFramework="net461" />
  <package id="Moq" version="4.5.21" targetFramework="net461" />
  <package id="NUnit" version="3.4.1" targetFramework="net461" />
</packages>

这些测试之前完美无缺。我不知道发生了什么变化让他们现在抛出这个错误。

可能安装了4.6.1 .net Framework?

请帮忙!

3 个答案:

答案 0 :(得分:7)

您的错误消息显示:

  

System.IO.FileNotFoundException:不可能充电器le fichier ou   l'assembly'Castle.Core,Version = 3.3.0.0 ,Culture = neutral,   PublicKeyToken = 407dd0808d44fbdc'ou une desesdépendances。 Le fichier   spécifiéestintrouvable。

但是您的包具有以下配置:

<package id="Castle.Core" version="3.3.3" targetFramework="net461" />
  1. 您确定您的单元测试项目和代码都使用了正确的程序集版本吗?
  2. 您的App.config文件中是否有任何程序集绑定重定向? https://stackoverflow.com/a/31013829/283787
  3. 他们都使用相同的NuGet包吗?
  4. 您无法使用FusionLogger查看程序集是如何解决的。

答案 1 :(得分:-1)

  1. 检查您的Package文件夹并删除所有未使用的DLL。
  2. 比较Package.Config文件VS App.Config并确保版本匹配

答案 2 :(得分:-2)

我遇到了一个与你非常相似的问题,唯一的区别是我已经构建了一个自定义库来在我的解决方案中生成几个虚假的商业模拟,以便在另一个测试中重用它。

我不知道如何在我的一个单元测试项目中将旧版本的Moq的dll作为参考出现。

这就解决了我的问题:

  1. 删除测试项目中的所有Moq NuGet包,检查包文件以确保没有留下Moq和Castle的包​​配置。
  2. 检查您的测试项目参考,以确保没有遗留旧版参考。如果Visual Studio无法正确处理,请将其自行删除。
  3. 关闭Visual Studio并导航到解决方案目录并查找名为“packages”的文件夹。检查是否有名为Moq的文件夹。如果是,请将其删除。
  4. 通过软件包管理器控制台或通过“管理Nuget软件包”选项为每个依赖Moq库的测试项目重新安装Moq软件包。