6

NUnit を使用してメソッドをテストするときに、WCF サービス メソッドで WebOperationContext が null であることを回避するにはどうすればよいですか

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について。

4

1 に答える 1

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;
    }
}

もちろん、依存性注入スキームを設定する方法は他にもあります。ここでは例として、サービス コンストラクターに渡す方法を使用しました。

于 2012-01-10T14:42:20.880 に答える