无法为引用可移植类库的程序集生成Fakes

时间:2014-03-08 16:09:14

标签: c# .net unit-testing portable-class-library microsoft-fakes

当所述类库引用在Visual Studio 2013下目标为.Net 4.5和Silverlight 5的PCL(可移植类库)时,我无法为类库(.NET 4.5)生成Microsoft Fakes程序集。

只有在类库(.NET 4.5):

时才会出现这种情况
  1. 声明一种类型派生类型,该类型可以在System.dll v4.0.0.0和v2.0.5.0中找到
  2. 声明从PCL库中声明的另一个派生类型,该类型又派生自System.dll v.2.0.5.0中声明的类型
  3. .NET 4.5类库和PCL库都编译得很好。但是我有一个单元测试项目(也是.NET 4.5)需要为.NET 4.5类库生成Fakes。试图生成假货失败并给我以下错误。

    error : assembly Repro.dll failed to load properly Could not resolve assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. Are you missing an assembly reference?
    

    尝试在我的单元测试项目中添加对System.Dll v2.0.5.0的引用失败,因为项目中已经存在对组件'System'v4.0.0.0的引用。

    我还尝试将App.Config添加到我的单元测试项目并为System.Dll定义程序集绑定重定向,但它不起作用。我怀疑程序集绑定重定向对Fakes生成没有任何影响。

    重现问题很简单。

    创建名为“Repro.Portable”的可移植类库,它具有单个接口:

    using System.ComponentModel; 
    
    namespace Repro.Portable
    {
       public interface IPortableEntity : INotifyPropertyChanged
       {
       }
    }
    

    然后创建一个名为“Repro”的.NET 4.5类库,它引用可移植类库并声明以下两个接口。

    using Repro.Portable;
    
    namespace Repro
    {
      public interface ISpecializedEntity : IPortableEntity
      {
      }
    }
    

    和...

    using System.ComponentModel;
    
    namespace Repro
    {
      public interface IOtherInterface : INotifyPropertyChanged
      {
      }
    }
    

    最后,创建一个引用Repro和Repro.Portable程序集的单元测试项目。此时编译将成功。但是,尝试为Repro程序集生成Microsoft Fakes将失败。

    由于所有这些看起来都是非常合法的事情,我想知道我是否遇到了Microsoft Fakes生成器中的错误,或者是否存在变通方法。

    有没有办法让Fakes生成工作,或者在遇到这种特定情况时我是否仍然使用不同的Mocking框架?

1 个答案:

答案 0 :(得分:2)

Microsoft为该错误提供了一种解决方法。

  

要解决此问题,请在.fakes文件中添加如下所示的XML blob。

<Compilation>
   <Reference Path="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile158\System.dll" FullName="System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"/>
</Compilation>

在本地构建时它确实有效,但是我还没有测试这是否是使用TFS在线构建服务器时可行的解决方法。