c# - 似乎无法伪造 RNGCryptoServiceProvider

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

我正在将我们的单元测试从 Moles 转换为新的 VS 2012 Fakes。我们的几个单元测试是“假的”RNGCryptoServiceProvider。我们能够“挖”出这个,但假货中似乎没有为此创建垫片。换句话说,我希望找到一个 ShimRNGCryptoServiceProvider。

更有趣的是,我在网上发现了一本名为“Better Unit Test with Microsoft Fakes”的电子书。在那里他们展示了一个伪造随机函数的例子。这是示例。

System.Fakes.ShimRandom.Constructor = (real) => { };        
System.Fakes.ShimRandom.AllInstances.NextDouble = this.NextDouble; 
System.Fakes.ShimRandom.AllInstances.NextInt32Int32 = this.NextInt32Int32; 
private int NextInt32Int32(Random random, int i, int arg3) 
{ 
    return (i + arg3) / 2; 
}

我什至在我的项目中没有看到 System.Fakes.ShimRandom。 我在 System.Fakes 中看到的仅有的两个 ShimShimDateTimeShimGuid

  • 我为 System 创建了 Fakes 程序集(它给了我 mscorlib.4.0.0.0.Fakes 和 System.4.0.0.0.Fakes)
  • 我没有更改配置文件(mscorlib.fakes 和 System.fakes)
  • 我的 Fakes 项目设置为在“任何 CPU”平台上构建。
  • 我们使用 .Net Framework 4.5 和 VS 2012 Ultimate。

我确实看到了一堆 stub ,包括System.Fakes.StubRandomSystem.Fakes.StubRandomNumberGenerator,但 stub 不会为我工作,因为我无法将它们注入(inject)到被测试的代码中。

  1. 知道为什么我没有得到 ShimRandom,而我似乎应该得到 ShimRandom,因为电子书中有一个示例?
  2. 如何“伪造”RNGCryptoServiceProvider

最佳答案

MS Fakes 框架目前不支持这些类型。

enter image description here

查找不受支持的类型的另一种方法是在 .fakes 文件中添加 Diagnostic = true 例如。

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic ="true">
   <Assembly Name="mscorlib" Version="4.0.0.0"/>

已更新

请注意,您无法伪造所有内容。这也意味着您也无法对所有内容进行 Shim。由于一些设计考虑,MS 决定不对某些系统类进行 Shim。 MS 没有提供明确的列表,因为这些类型可以根据用户的 .NET 版本和目标 .NET 框架的组合进行伪造。例如,在 .NET 4 中,System.Security 中的某些成员、System.Threading Fakes 中的类型不会生成 Shims。

您可以尝试覆盖此行为,例如将以下 xml 添加到 .Fakes 文件

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic ="true">
   <Assembly Name="mscorlib" Version="4.0.0.0"/>
   <ShimGeneration>
      <Add FullName="System.Security.Cryptography"/>
   </ShimGeneration>
</Fakes>

上面的内容会产生与我在上面的答案中提供的相同的警告。这意味着它们不受支持。

但正如我之前所说,它是.NET版本和目标框架的组合。如果您可以更改目标 .NET 框架(例如 .NET 2),仍然使用 mscorlib 版本 4.0.0.0,您会看到为 RNGCryptoServiceProvider 生成了 Shim。 .

 <Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true" TargetFrameworkVersion="2.0.0.0">
   <Assembly Name="mscorlib" Version="4.0.0.0"/>
     <ShimGeneration>
      <Clear/>
        <Add FullName="System.Security.Cryptography"/>
     </ShimGeneration>
 </Fakes>

同样适用于 RandomNumberGenerator .

enter image description here

关于c# - 似乎无法伪造 RNGCryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20461084/

相关文章:

visual-studio-2012 - 无法加载 "Aurigma Graphicsmill",加载格式不正确的程序

c# - 将日期时间设置为空

c# - 根据用户角色呈现不同的 View ASP.NET MVC 5

sql-server - 将 SQL Server 单元测试项添加到 visual studio 2017 中的单元测试项目时出错

c# - 使用不同的值调用方法两次使用最小起订量进行单元测试

c++ - Visual Studio C++ 项目中所需的 DLL

c# - 文件流和编码

c# - Count是否实现了一个IEnumerable

c# - 如何确保在每个循环上创建一个新的 Person?

visual-studio-2012 - CMAKE用于/DEF和/NODEFAULTLIB