【问题标题】:Why won't Fakes properly reference a Fakes dll from a prebuilt Fakes project?为什么 Fakes 不能从预构建的 Fakes 项目中正确引用 Fakes dll?
【发布时间】:2018-11-08 01:29:33
【问题描述】:

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

我有许多 VS12 解决方案,我正在使用 MS Fakes 为其编写单元测试。根据以下 URL 中的建议,我决定为我的假 Dll 创建一个项目:Code generation, compilation, and naming conventions in Microsoft Fakes。 这个想法是伪造 DLL 的位置将被本地化,我不需要在我的测试项目中散布大量伪造的 DLL。 (我将其称为普通假货库。)

在我当前的单元测试中,我使用来自PresentationCoreSystem.ManagementSystem 的垫片。但是,我使用的系统垫片实际上位于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.Shims.ShimNotSupportedException,命名不受支持的 shimmed 类。使用 PresentationCore 和 System.Management 功能的测试在引用常见的 fakes 库时仍然有效。

但是,如果我在我的测试项目中直接(间接地)为 System 添加 Fakes 程序集,请在我的测试项目中创建完全相同的 mscorlib.fakes 文件,并添加对 local 的引用mscorlib.4.0.0.0.Fakes Dll,链接到常见假货库时引发异常的测试运行无故障。

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

有谁知道为什么在 common fakes 库中引用 mscorlib fake 不起作用?

【问题讨论】:

    标签: c# .net mocking microsoft-fakes shim


    【解决方案1】:

    Fakes 的问题在于,它旨在在每次构建时重新生成 dll。这对于系统 dll 来说不太重要,但值得记住。您可能应该将它们保留在项目中,因为您无法确定它们之间的链接如何用于 shim。

    我不知道 shims 是如何实现的,但它们显然会在运行时覆盖方法。我认为我们需要开发人员来更详细地回答它,但它甚至可能是 mscorlib 的问题,它已经对 Fakes 的支持有些不稳定(按设计)。

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

    测试的目标是降低维护成本,因此隐藏内容对他们来说不如对普通代码重要;它只是在维护过程中增加了一些步骤。假货对于大多数人来说已经足够神秘了,没有额外的压力“哦,但它被间接引用了......这甚至有效吗?”

    【讨论】:

      【解决方案2】:

      似乎具有相同假货程序集的多个项目可能会相互覆盖并导致问题。请参阅 SteveInCO 在https://social.msdn.microsoft.com/Forums/vstudio/en-US/8b4dfe6c-4373-4b9c-bfec-23459d674315/build-fails-on-running-tests-with-shims?forum=vsmantestMicrosoft.Win32.ShimRegistryKey not working on build machine 的回答,它引用了这个问题中提到的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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        • 2014-01-08
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多