我的网络应用程序通过 piv 卡使用 PKI 身份验证。我通过 HttpClientCertificate.Subject 获取用户的唯一标识符信息。问题是当我进行单元测试时,mock 不会模拟这个类,因为它没有构造函数。我尝试按照此线程上的建议进行操作:
但看起来他设置它的方式是通过控制器的构造函数注入客户端证书,我不想这样做,因为控制器已经可以访问客户端证书。我假设这就是他所暗示的,因为他正在使用某种类型的适配器模式。有人有更好的建议吗?
我的网络应用程序通过 piv 卡使用 PKI 身份验证。我通过 HttpClientCertificate.Subject 获取用户的唯一标识符信息。问题是当我进行单元测试时,mock 不会模拟这个类,因为它没有构造函数。我尝试按照此线程上的建议进行操作:
但看起来他设置它的方式是通过控制器的构造函数注入客户端证书,我不想这样做,因为控制器已经可以访问客户端证书。我假设这就是他所暗示的,因为他正在使用某种类型的适配器模式。有人有更好的建议吗?
你为什么不把它包装到你自己的对象中呢?
class MyHttpClientCertificate
{
public MyHttpClientCertificate(HttpClientCertificate foo) { ... }
internal MyHttpClientCertificate() { ... }
}
您的问题是代码使用 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};