我的网络应用通过枢纽卡使用PKI身份验证。我通过HttpClientCertificate.Subject获取用户的唯一标识符信息。问题是当我进行单元测试时,mock不会模拟这个类,因为它没有构造函数。我试着按照这个帖子的建议:
How to mock HttpClientCertificate?
但看起来他设置它的方式是通过控制器的构造函数注入客户端证书,我不想做,因为控制器已经可以访问客户端证书。因为他正在使用某种类型的适配器模式,所以我假设这是他所暗示的。有没有人有更好的建议?
答案 0 :(得分:1)
为什么不将它包装到你自己的对象中?
class MyHttpClientCertificate
{
public MyHttpClientCertificate(HttpClientCertificate foo) { ... }
internal MyHttpClientCertificate() { ... }
}
答案 1 :(得分:0)
您的问题是代码使用Request对象来获取证书,但这不容易单元测试。
我要做的是添加一个函数委托,默认情况下,它将使用Request对象返回HttpClientCertificate,但允许覆盖实现。
对于控制器,添加:
internal Func<HttpClientCertificate> HttpClientCertificateGetter = () => {
return Request.ClientCertificate;
}
在Controller中而不是使用Request使用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};