ASP.NET MVC 4单元测试 - 有没有办法用Moq模拟HttpClientCertificate

时间:2013-04-22 19:03:20

标签: asp.net-mvc unit-testing

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

How to mock HttpClientCertificate?

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

2 个答案:

答案 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};