似乎无法伪造RNGCryptoServiceProvider

 季孙意如 发布于 2023-02-12 10:10

我正在将我们的单元测试从Moles转换为新的VS 2012 Fakes.我们的几个单元测试"假" RNGCryptoServiceProvider.我们能够"mole"这个,但似乎在假货中没有为它创造了Shim.换句话说,我希望找到一个ShimRNGCryptoServiceProvider.

更有趣的一点是,我在网上找到了一本名为"使用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.FakesShimDateTimeShimGuid.

我为System创建了Fakes程序集(它给了我mscorlib.4.0.0.0.Fakes和System.4.0.0.0.Fakes)

我没有更改配置文件(mscorlib.fakes和System.fakes)

我将我的Fakes项目设置为"Any CPU"平台.

我们正在使用.Net Framework 4.5和VS 2012 Ultimate.

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

    知道为什么我没有得到ShimRandom,因为在电子书中有一个例子吗?

    我怎么"假" RNGCryptoServiceProvider

Spock.. 5

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

在此输入图像描述

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


   

更新

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

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


   
   
      
   

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

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

 
   
     
      
        
     
 

这同样适用于RandomNumberGenerator.

在此输入图像描述

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有