4

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

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

在我当前的单元测试中,我使用来自PresentationCore,System.ManagementSystem. 但是,我使用的 System shims 实际上是 in 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 文件,这些文件可以清除然后按名称添加类。

但是,在我的测试项目中,当我从我的 common fakes 库中添加 mscorlib.4.0.0.0.Fakes DLL 的引用时,使用 Convert 和 DriveInfo 垫片的测试不会运行。相反,测试方法会引发 Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException,命名不受支持的 shimmed 类。使用 PresentationCore 和 System.Management 功能的测试在引用通用假库时仍然有效。

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

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

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

4

2 回答 2

1

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

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

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

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

于 2013-10-14T19:42:53.193 回答
0

似乎具有相同假货程序集的多个项目可以相互覆盖并导致问题。请参阅 SteveInCO 在https://social.msdn.microsoft.com/Forums/vstudio/en-US/8b4dfe6c-4373-4b9c-bfec-23459d674315/build-fails-on-running-tests-with-shims?forum的回答=vsmantest,以及Microsoft.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>
于 2018-11-07T17:21:51.067 回答