替换密封的班级

时间:2014-02-21 09:36:25

标签: c# unit-testing nsubstitute

我有一个类A,它将HttpRequestHeaders作为属性公开。被测试的课程是B

  • B正在使用A
  • A也是一个假类,仅用于单元测试。
  • A继承了一个强加HttpRequestHeaders属性定义的接口。

所以我需要替换HttpRequestHeaders以便我可以测试B 不幸的是HttpRequestHeaders是一个密封的类,因此它不能被NSubstitute替代:

  

无法从中加载“Castle.Proxies.HttpRequestHeadersProxy_2”类型   程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,   PublicKeyToken = a621a9e7e5c32e69'因为父类型是密封的。

克服这种情况的一般解决方案是什么?

2 个答案:

答案 0 :(得分:4)

我没有试图找到伪造sealed对象的方法,而是想看看我是否可以得到一个真实的实例,假设它没有太多的依赖关系。

从好的方面来说,HttpRequestHeaders没有太多的依赖关系。在不利方面,它只有一个internal构造函数。但令人高兴的是,HttpRequestMessage可以自由构建并公开Headers属性,它将为您执行所需的构造。

或者,您可以考虑使用反射来创建对象,尽管它只有internal构造函数 - 它会选择您的毒药时间 - 创建一个不需要的一次性对象来干净地创建标题,或者开始使用反射。 / p>

答案 1 :(得分:1)

根据您使用的Visual Studio版本,尝试Fakes(http://msdn.microsoft.com/en-us/library/hh549175.aspx

如果您无法控制依赖项,这将非常有用。