1

我的网络应用程序通过 piv 卡使用 PKI 身份验证。我通过 HttpClientCertificate.Subject 获取用户的唯一标识符信息。问题是当我进行单元测试时,mock 不会模拟这个类,因为它没有构造函数。我尝试按照此线程上的建议进行操作:

如何模拟 HttpClientCertificate?

但看起来他设置它的方式是通过控制器的构造函数注入客户端证书,我不想这样做,因为控制器已经可以访问客户端证书。我假设这就是他所暗示的,因为他正在使用某种类型的适配器模式。有人有更好的建议吗?

4

2 回答 2

1

你为什么不把它包装到你自己的对象中呢?

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

    internal MyHttpClientCertificate() { ... }
}
于 2013-04-22T19:25:04.310 回答
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};
于 2013-04-22T19:27:53.467 回答