【问题标题】:Cannot seem to Fake RNGCryptoServiceProvider似乎无法伪造 RNGCryptoServiceProvider
【发布时间】:2013-12-09 00:23:44
【问题描述】:

我正在将我们的单元测试从 Moles 转换为新的 VS 2012 Fakes。我们的几个单元测试“假”RNGCryptoServiceProvider。我们能够“消除”这个问题,但在 Fakes 中似乎没有为它创建 Shim。换句话说,我希望找到一个 ShimRNGCryptoServiceProvider。

一个更有趣的方面是我在网上找到了一本名为“使用 Microsoft Fakes 进行更好的单元测试”的电子书。在那里,他们展示了一个伪造 Random 函数的示例。这是一个例子。

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 仅有的两个 ShimsShimDateTime 和 @987654326 @。

  • 我为 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。

我确实看到了一堆存根,包括System.Fakes.StubRandomSystem.Fakes.StubRandomNumberGenerator,但是存根对我不起作用,因为我无法将它们注入到被测代码中。

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

【问题讨论】:

  • RNGCryptoServiceProvidersealed class。这是您无法更改的特定实现。您可能应该首先尝试伪造它的基类,更通用的RandomNumberGenerator
  • 另外,您提到存根无法工作,因为您无法注入它。这可能会告诉你,要么你不应该编写这个测试,要么你应该注入依赖。

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


【解决方案1】:

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

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

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

更新

请注意,您不能伪造所有内容。这也意味着您也不能对所有内容进行填充。由于某些设计考虑,MS 决定不对某些系统类进行填充。 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

【讨论】:

  • 那是一个存根。我在找垫片。知道为什么当微软以它为例时我没有得到 ShimRandom 吗?
  • @GeneS 同样适用。它基于 .NET 运行时版本和目标框架。请参阅我的“更新”答案以获得全面的解释。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多