1

私の Web アプリは、piv カード経由で PKI 認証を使用しています。HttpClientCertificate.Subject を介してユーザーの一意の識別子情報を取得します。問題は、単体テストを行っているときに、コンストラクターがないため、モックがこのクラスをモックしないことです。このスレッドのアドバイスに従ってみました:

HttpClientCertificate をモックする方法は?

しかし、彼がそれを設定する方法は、コントローラーがすでにクライアント証明書にアクセスしているため、コントローラーのコンストラクターを介してクライアント証明書を挿入することであるように見えます。彼はある種のアダプターパターンを使用しているので、それが彼が暗示していることだと思います。誰もがより良い提案を得ましたか?

4

2 に答える 2

0

あなたの問題は、コードが Request オブジェクトを使用して証明書を取得していることですが、それは簡単に単体テストできません。

私がすることは、デフォルトで Request オブジェクトを使用して HttpClientCertificate を返すが、実装をオーバーライドできる関数デリゲートを追加することです。

コントローラーの場合、これを追加します。

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

また、コントローラーでは、Request を使用する代わりに HttpClientCertificateGetter を使用します。

次に、単体テストで証明書をモックし、次のようにゲッター関数に割り当てます。

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 に答える