2013-04-22 70 views
1

我的web应用程序是通过PIV卡使用PKI认证。我通过HttpClientCertificate.Subject获取用户的唯一标识符信息。问题是,当我是单元测试时,mock不会嘲笑这个类,因为它没有构造函数。我想下面就这个线程的建议:ASP.NET MVC 4单元测试 - 有没有办法来嘲笑HttpClientCertificate与起订量

How to mock HttpClientCertificate?

但看起来他设立,那是注入通过控制器的构造函数,我不客户端证书的方式”想做因为控制器已经有访问客户端证书。我假设他是什么意思,因为他使用某种类型的适配器模式。任何人有更好的建议?

回答

1

你为什么不把它包装成自己的对象?

class MyHttpClientCertificate 
{ 
    public MyHttpClientCertificate(HttpClientCertificate foo) { ... } 

    internal MyHttpClientCertificate() { ... } 
} 
+0

这需要我来注入客户端证书到我的控制器,我不想做因为控制器已经有权访问它。 – RiceRiceBaby 2013-04-23 19:46:17

+0

只是覆盖控制器具有'new' – 2013-04-23 19:49:06

0

您的问题是,代码使用Request对象来获取证书,但这不容易单元测试。

我会做的是补充的是,在默认情况下,将使用Request对象返回HttpClientCertificate,但允许重写实现的功能代表。

对于控制器,补充一点:

internal Func<HttpClientCertificate> HttpClientCertificateGetter =() => { 
    return Request.ClientCertificate; 
} 

而在你的控制,而不是使用要求使用HttpClientCertificateGetter。

然后在你的单元测试,你嘲笑的证书,并将其分配给getter函数,就像这样:

var certMock = new Mock<HttpClientCertificate>(); 
HttpClientCertificate clientCertificate = certMock.Object; 
requestMock.Setup(b => b.ClientCertificate).Returns(clientCertificate); 
certMock.Setup(b => b.Certificate).Returns(new Byte[] { }); 

controller.HttpClientCertificateGetter =() => {certMock.Object}; 
+1

我想你的方法,但不能得到它的工作性质。显然你不能使用moq来模拟httpclientcertificate,因为这个类没有构造函数。 – RiceRiceBaby 2013-04-23 16:07:59