gpt4 book ai didi

c# - 似乎无法伪造 RNGCryptoServiceProvider

转载 作者:行者123 更新时间:2023-12-02 21:41:02 25 4
gpt4 key购买 nike

我正在将我们的单元测试从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com