一連の統合テストから呼び出している次のスニペットがあります。
private void Url_Contains_String_With_Certificate_Warning(string url, string expected) {
// This line should restore default cert validation behaviour
ServicePointManager.ServerCertificateValidationCallback = null;
var wc = new WebClient();
try {
wc.DownloadString(url);
Assert.Fail("Should have thrown a WebException by now");
} catch (WebException x) {
Assert.That(x.InnerException is AuthenticationException, "Expected an AuthenticationException inside a WebException due to invalid certificate");
Assert.AreEqual("The remote certificate is invalid according to the validation procedure.", x.InnerException.Message);
}
// This line overrides cert validation behaviour to accept invalid certs
ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };
var result = wc.DownloadString(url);
Assert.That(result.Contains(expected), String.Format("Didn't find expected text '{0}' in HTML response", expected));
}
ただし、特定のテスト実行の最初のテストのみが合格します...この行を実行すると、次のようになります。
ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };
このデリゲートを明示的にnullに割り当てたとしても、同じテスト実行でWebClientに証明書エラーを再度スローさせることはできません。また、明示的にfalseを返すようにしました。名前付きデリゲート参照を追加してから削除しようとしましたが、単に割り当て/再割り当てするのではなく、コールバックでSslPolicyErrorsをチェックして、policyErrors == SslPolicyErrors.None
何も機能しません。
(テスト環境の特定のURLが証明書の警告を返すことを明示的に確認しています。また、ユーザーが証明書の警告を無視すると、特定のページが表示されるため、証明書の処理が少し変わっていることも確認する必要があります)
何か案は?