2013-12-09 90 views
2

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

一个更有趣的方面是,我在网上发现了一本名为“微软假货更好的单元测试”的电子书。在那里他们展示了一个伪造随机函数的例子。这里是例子。

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

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

我确实看到了一堆存根,包括System.Fakes.StubRandomSystem.Fakes.StubRandomNumberGenerator,但存根不会为我工作,因为我没有他们注入的代码测试的方式。

  1. 任何想法为什么我没有得到一个ShimRandom,当它似乎我应该是因为它有一个例子在电子书?
  2. 我该如何“伪造”RNGCryptoServiceProvider
+0

'RNGCryptoServiceProvider'是'密封类'。这是您无法更改的特定实施。你应该先尝试伪造它的基类,更通用的['RandomNumberGenerator'](http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(v = vs.110) )的.aspx)。 –

+1

此外,你提到一个存根将不起作用,因为你没有办法注入它。这可能会告诉你,你不应该写这个测试,或者你应该注入依赖。 – Magus

回答

5

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

enter image description here

另一种方式找到不支持的类型,在你的.fakes文件中添加诊断= 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中的类型不会生成,因此不会生成Shim。

你可以尝试重写此行为,例如添加以下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

+0

这是一个存根。我正在寻找Shims。还有什么想法,为什么我没有得到ShimRandom当微软使用它作为例子? –

+0

@ GeneS同样适用。它基于.NET运行时版本和目标框架。请参阅我的“已更新”答案以获得全面的解释。 – Spock