c# - Microsoft Fakes x64 而不是 x86 和 v4.5

标签 c# unit-testing visual-studio-2012 microsoft-fakes

我正在使用 Microsoft Fakes 测试框架。由于我无法更改的“遗留”代码,我需要使用 shim/moles 方法来解决这个问题。它是来自没有来源的供应商的代码,它是在没有考虑测试的情况下编写的。所以我坚持使用 3 种可能的框架,TypeMock(昂贵)、Telerik 的 JustMock(昂贵)或 Microsoft 的 Fakes。因为我们已经有了 VS Ultimate,所以我们选择假货。由于大多数人认为他们需要建议以某种方式重写或修改代码以支持使用接口(interface)和/或依赖项注入(inject),我会预先告诉您,这不是一个选项。

我遇到的一个问题是我试图伪造的库很大,需要使用 64 位版本的 fakes.exe 而不是 32 位版本 (fakes.x86.exe),它遇到 32 位应用程序的内存限制。

第二个问题是我需要使用v4.5框架编译fakes库。虽然没有记录,但可以通过命令行实现。原因是在 v4.5 中,他们在 System.Collections.Generic 中添加了 IReadOnly* 接口(interface),并且库使用了它们。使用 v4 编译,如预期的那样抛出错误,指出未找到类型。

问题是,Visual Studio 始终使用 x86 版本和 v4.0 框架,我找不到覆盖它的方法。有人知道如何让它使用 64 位和 v4.5 框架吗?我目前的想法是不使用 visual studio 的内置东西,只使用命令行并手动引用文件。然后在每次更新 dll 时,我们都会手动重新创建它并更新引用。此文件不会经常更新,因此有可能。

我用来手动生成 fakes 库的命令行(有人可能会觉得这很有用)是:

"c:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\fakes\fakes.exe" <assembly> /tfv:v4.5

help 命令仅显示 v2、v3.5 和 v4 是 tfv 的可能选项,但只是为了好玩,我尝试了 v4.5。

我已经尝试将应用程序上的架构强制为 x64 而不是任何 cpu,它运行的 fakes.exe 没有变化。 查看 .csproj 文件进行测试,没有变化。 查看 fakes.exe 的 .csproj 文件,它说使用框架的 v4,在 visual studio 中打开,更改为 v4.5,编译正常。使用 fakes 命令行,编译正常。 项目中的.fakes文件中有一个属性可以定义编译器版本,但是设置为v4.5还是不行。我假设 Visual Studio 中的版本从 v4 更改为 v4.5 也更改了程序集引用。我的下一次尝试是尝试更改模板项目(如果我能找到的话)。

最佳答案

@schellack - 这就是我如何能够“引用创建的假 dll 并确保所需的引用在您的测试项目中”

  1. 在本地编译并运行所有单元测试,并确保它们通过
  2. 在项目的主目录(与 .csproj 文件相同的位置)中,现在应该有一个“FakesAssemblies”目录。在该目录中将是生成的 System.Web.Mvc.4.0.0.0.Fakes.dll(或您使用的任何版本号)。对 System.Web.Mvc.4.0.0.0.Fakes 的项目引用已经有指向该目录和 dll 的提示路径。 该目录和dll都需要添加到源代码管理中。它们不需要添加到VS中。
  3. 为了编译我们的 CI 构建机器,我还必须将 Microsoft.QualityTools.Testing.Fakes.dll 添加到项目中。
    1. 我在 C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies 中找到了 Microsoft.QualityTools.Testing.Fakes.dll
    2. 在项目的主目录(与 .csproj 文件相同的位置)中,有一个“Fakes”目录,该目录包含在项目中(在 VS 中可见)并受源代码控制。它有一个 .fakes 文件。我通过 VS 将 Microsoft.QualityTools.Testing.Fakes.dll 复制到此目录中,以便它也添加到项目中。
    3. 项目的 .csproj 文件中的提示路径需要添加/更新以在 Fakes 目录中查找。我在我的 .csproj 文件中找到了引用并将其更改为如下所示:

<Reference Include="Microsoft.QualityTools.Testing.Fakes, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
    <HintPath>Fakes\Microsoft.QualityTools.Testing.Fakes.dll</HintPath>
</Reference>

现在一切都编译和单元测试运行

关于c# - Microsoft Fakes x64 而不是 x86 和 v4.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14969301/

相关文章:

c# - 如何自动保存和自动加载 winforms C# 中的所有属性?

c# - 如果我不再关心结果,是否还有结束委托(delegate)的方法?

java - 如何使用 Mockito 测试 api?我们需要模拟所有的类变量吗?

unit-testing - 如何覆盖 GOLANG 中的多个文件

c++ - 如何在 visual studio 2012 中命名 openmp 中的关键部分

c# - 正则表达式回溯与更改和空白

javascript - 错误 TS2304 : Cannot find name 'createNewEvent'

Visual Studio 2012 IDE 中的 JSON 编辑器(突出显示、折叠、验证)

.net - Clickonce app.config 连接字符串

c# - 我如何捕捉 iTunes 事件?