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

Jer*_*acs 5 c# unit-testing dotnet-httpclient

我有一个经过身份验证的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.
    }
}
Run Code Online (Sandbox Code Playgroud)

...如何测试该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.
    }
}
Run Code Online (Sandbox Code Playgroud)

......或者我试图测试错误的东西?

And*_*eas 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);
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以放心地知道客户端证书是在应该添加的时候添加的。希望这可以帮助!