gpt4 book ai didi

c# - 似乎无法伪造 RNGCryptoServiceProvider

转载 作者:行者123 更新时间:2023-12-02 04:42:52 27 4
gpt4 key购买 nike

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

一个更有趣的方面是我在网上找到一本电子书,名为“Better Unit Testing 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。我看到的只有两个 Shim System.FakesShimDateTimeShimGuid

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

我确实看到了一堆 Stubs,包括 System.Fakes.StubRandomSystem.Fakes.StubRandomNumberGenerator,但 Stubs 不会为我工作,因为我无法将它们注入(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"/>

已更新

请注意,您无法伪造所有内容。这也意味着您也不能对所有内容进行填充。出于某些设计考虑,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/

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