2013-04-22 91 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

相關問題