如何测试 HttpClient 是否包含客户端证书?

7

我有一个已认证的HttpClient生成器类的实现,类似于这样:

public class X509Authentication : IClientAuthenticator
{
    protected readonly X509Certificate2 Certificate;

    public X509Authentication(X509Certificate2 certificate)
    {
        if (certificate == null) throw new ArgumentNullException("certificate");
        Certificate = certificate;
    }

    public HttpClient GenerateClient()
    {
        var clientHandler = new WebRequestHandler();
        clientHandler.ClientCertificates.Add(Certificate);
        var request = new HttpClient(clientHandler);
        return request;
    }
    public void Dispose()
    {
        //nothing to do here.
    }
}

如何测试GenerateClient()方法是否已成功将客户端证书附加到HttpClient类?

[TestMethod]
public void HttpClientCreationIncludesCertificate()
{
    using (var auth = new X509Authentication(_certificate))
    using (var client = auth.GenerateClient())
    {
        Assert...what?  The certificate(s) are not visible here.
    }
}

...或者我正在尝试测试错误的东西吗?


没有人吗?真的吗?我真的没想到这会是一个困难的问题。 - Jeremy Holovacs
1个回答

1

虽然这个问题已经9个月了,但无论如何 :)

我会怎么做。您对接口的想法是正确的。现在您有了一个接口,可以模拟“真正”的GenerateClient实现,因为该方法除了使用其他人的代码(该代码本身就不太友好)之外没有其他作用。

在这种情况下,我要测试的是应该调用IClientAuthenticator.GenerateClient的方法是否真的调用了它。例如 ->

[TestMethod]
Public void MyClass_MymethodthatcallsGenereateClient_DoesCallGenerateClient()
{
    // Arrange
    Mock<IClientAuthenticator> clientAuth = new Mock<IClientAuthenticator>();
    MyClass myclass = new MyClass()

    // Act
    var result = MyClass.MymethodthatcallsGenereateClient();

    // Assert (verify that we really added the client)
    clientAuth.Verify(x => x.GenerateClient);
}

现在我们可以放心,知道客户端证书已经在应该添加它的时候被添加了。希望这有所帮助!

嗯...不是我想要测试的,但我想这样就可以了。 - Jeremy Holovacs
我并不是说这是唯一的解决方案,但这是我为单元测试所做的 :) 另一个解决方案是集成测试,您可以发送Web客户端请求并查看响应头。 - Andreas
哈哈,是的,那不是我想做的。 :) - Jeremy Holovacs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接