【问题标题】:ASP.NET MVC 4 Unit Test - Is there a way to mock HttpClientCertificate with MoqASP.NET MVC 4 单元测试 - 有没有办法用 Moq 模拟 HttpClientCertificate
【发布时间】:2013-04-22 19:03:20
【问题描述】:

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

How to mock HttpClientCertificate?

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

【问题讨论】:

    标签: asp.net-mvc unit-testing


    【解决方案1】:

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

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

    【讨论】:

    • 这将需要我将客户端证书注入我的控制器,我不想这样做,因为控制器已经可以访问它。
    • 只需用new覆盖控制器的属性
    【解决方案2】:

    您的问题是代码使用 Request 对象来获取证书,但这不容易进行单元测试。

    我要做的是添加一个函数委托,默认情况下,它将使用 Request 对象返回 HttpClientCertificate,但允许覆盖实现。

    对于控制器,添加以下内容:

    internal Func<HttpClientCertificate> HttpClientCertificateGetter = () => {
      return Request.ClientCertificate;
    }
    

    并且在你的控制器中而不是使用 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};
    

    【讨论】:

    • 我尝试了您的方法,但无法使其发挥作用。显然,您不能使用 moq 来模拟 httpclientcertificate,因为该类没有构造函数。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多