我想为 WCF Web 服务编写单元测试。该服务使用 HttpContext.Current。我已经设法通过向 System.Web 添加一个 Fake Assembly 和一些代码来伪造它:
[Test]
public void TestMyService()
{
using (ShimsContext.Create())
{
HttpRequest httpRequest = new HttpRequest("", "http://tempuri.org", "");
HttpContext httpContext = new HttpContext(httpRequest, new HttpResponse(new StringWriter()));
System.Web.Fakes.ShimHttpContext.CurrentGet = () => { return httpContext; };
System.Web.Fakes.ShimHttpClientCertificate.AllInstances.IsPresentGet = (o) => { return true; };
}
}
但我的服务也需要ClientCertificate:
if (!HttpContext.Current.Request.ClientCertificate.IsPresent) // <== Exception in unit test!
throw new Exception("ClientCertificate is missing");
_clientCertificate = new X509Certificate2(HttpContext.Current.Request.ClientCertificate.Certificate);
现在在标记的行中,单元测试会抛出 NullReferenceException:
结果消息:System.NullReferenceException:对象引用未设置为对象的实例。结果 StackTrace:在 System.Web.HttpClientCertificate..ctor(HttpContext context) 在 System.Web.HttpRequest.CreateHttpClientCertificateWithAssert() 在 System.Web.HttpRequest.get_ClientCertificate() 在 (我的方法) 在 TestMyService()
如何为单元测试设置 ClientCertificate?我不知道如何创建一个通过 Shim 传递的 HttpClientCertificate 对象,因为没有合适的构造函数。