使用Nunit测试WCF方法但WebOperationContext为null

时间:2012-01-10 14:32:52

标签: wcf nunit weboperationcontext

在使用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。

1 个答案:

答案 0 :(得分:5)

通常,您希望以某种方式模仿WebOperationContextWCFMock内置了一些可以为您完成此操作的内容。

或者,您可以使用一些依赖注入来从其他地方获取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;
    }
}

当然还有其他方法可以设置依赖注入方案,我只是将其作为示例传递给服务构造函数。