在使用NUnit测试方法时,如何绕过WCF服务方法中的WebOperationContext为空
我有一个单元测试项目,使用NUnit来测试WCF方法返回的数据:
public class SampleService
{
public XmlDocument Init ()
{
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
return _defaultInitializationXMLfile;
}
}
然后我有一个测试方法如下
[TextFixture]
public class SampleServiceUnitTest
{
[Test]
public void DefaultInitializationUnitTest
{
SampleService sampleService = new SampleService();
XMLDocument xmlDoc = sampleService.Init();
XMLNode xmlNode = xmlDoc.SelectSingleNode("defaultNode");
Assert.IsNotNull(xmlNode, "the default XML element does not exist.");
}
}
但是我在测试期间收到错误
SampleServiceUnitTest.DefaultInitializationUnitTest:
System.NullReferenceException : Object reference not set to an instance of an object.
关于SampleService方法中的WebOperationContext。
答案 0 :(得分:5)
通常,您希望以某种方式模仿WebOperationContext
。 WCFMock内置了一些可以为您完成此操作的内容。
或者,您可以使用一些依赖注入来从其他地方获取WebOperationContext,从而打破该依赖关系,如:
public class SampleService
{
private IWebContextResolver _webContext;
// constructor gets its dependency, a web context resolver, passed to it.
public SampleService(IWebContextResolver webContext)
{
_webContext = webContext;
}
public XmlDocument Init ()
{
_webContext.GetCurrent().OutgoingResponse.ContentType = "text/xml";
return _defaultInitializationXMLfile;
}
}
public class MockWebContextResolver : IWebContextResolver
{
public WebOperationContext GetCurrent()
{
return new WebOperationContext(...); // make and return some context here
}
}
public class ProductionWebContextResolver : IWebContextResolver
{
public WebOperationContext GetCurrent()
{
return WebOperationContext.Current;
}
}
当然还有其他方法可以设置依赖注入方案,我只是将其作为示例传递给服务构造函数。