C# 为什么赢了';t Fakes是否正确引用预构建Fakes项目中的Fakes dll?

C# 为什么赢了';t Fakes是否正确引用预构建Fakes项目中的Fakes dll?,c#,.net,mocking,microsoft-fakes,shim,C#,.net,Mocking,Microsoft Fakes,Shim,我在尝试从单独的项目中引用mscorlib伪DLL时遇到问题,如下所述 我有许多VS12解决方案,我正在使用MS Fakes为其编写单元测试。基于以下URL中的建议,我决定为我的伪DLL创建一个项目:。 这个想法是,伪造DLL的位置将被本地化,我不需要在整个测试项目中散布大量伪造的DLL。(我将其称为常见假货库。) 在当前的单元测试中,我使用了PresentationCore、System.Management和System中的垫片。然而,我使用的系统垫片实际上在mscorlib.dll中,更具

我在尝试从单独的项目中引用mscorlib伪DLL时遇到问题,如下所述

我有许多VS12解决方案,我正在使用MS Fakes为其编写单元测试。基于以下URL中的建议,我决定为我的伪DLL创建一个项目:。 这个想法是,伪造DLL的位置将被本地化,我不需要在整个测试项目中散布大量伪造的DLL。(我将其称为常见假货库。)

在当前的单元测试中,我使用了
PresentationCore
System.Management
System
中的垫片。然而,我使用的系统垫片实际上在
mscorlib.dll
中,更具体地说是Convert(静态类)和DriveInfo(密封类)。因为我现在只需要mscorlib中的这两个类,所以我为mscorlib创建了以下.fakes文件:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>    
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
    <Add FullName="Convert"/>
    <Add FullName="DriveInfo"/>
  </ShimGeneration>
</Fakes>

对于PresentationCore和SystemManagement,我有类似的.fakes文件,可以清除这些文件,然后按名称添加类

但是,在我的测试项目中,当我从我的公共Fakes库中添加mscorlib.4.0.0.0.Fakes DLL的引用时,使用Convert和DriveInfo垫片的测试不会运行。相反,测试方法抛出一个Microsoft.QualityTools.Testing.Fakes.Shimmes.ShimNotSupportedException,命名不支持的填充类。使用PresentationCore和System.Management中的功能进行的测试在引用常见假货库时仍然有效

但是,如果我在测试项目中直接(和间接)为系统添加伪造程序集,请在测试项目中创建完全相同的mscorlib.Fakes文件,并添加对本地mscorlib.4.0.0.0.Fakes Dll的引用,则在链接到公共伪造库时引发异常的测试运行时不会出现故障

我已经使用对象浏览器查看了common fakes库中的mscorlib伪造DLL,并将其与本地构建的DLL进行了比较,它们似乎是相同的


有人知道为什么在通用fakes库中引用mscorlib伪代码不起作用吗?

关于fakes的事情是,它意味着在每个构建上重新生成DLL。这对于系统DLL不太重要,但值得记住。您可能应该将它们保留在项目中,因为您无法确定它们之间的链接如何进行

我不知道垫片是如何实现的,但它们显然会在运行时重写方法。我认为我们需要一个开发人员来更详细地回答这个问题,但这甚至可能是mscorlib的一个问题,它已经有了一些对假货(设计上)的脆弱支持

但最终,您的目标似乎是在您的测试项目上节省几次点击,同时冒着您的赝品失去同步的风险。发生这种情况的机会并不重要——可能不值得让你的测试不那么明确


测试的目标是降低维护成本,因此隐藏东西对他们来说没有普通代码那么重要;它只是为维护过程添加了一些步骤。假货对于大多数人来说已经足够神秘了,没有额外的“哦,但是它被间接引用了…”。。。这是否有效?“

似乎多个项目使用相同的伪造程序集可能会相互覆盖并导致问题。请参阅SteveInCO在的答案,同时也参考了本问题中提到的msdn文章,其中指出使用常见的假货创建单独的项目可以优化构建时间

我认为fakes文件不起作用的原因是FullName值没有完整的名称空间。试一试

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>    
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
    <Add FullName="System.Convert"/>
    <Add FullName="System.IO.DriveInfo"/>
  </ShimGeneration>
</Fakes>