Тестирование методов WCF с помощью Nunit, но WebOperationContext имеет значение null - PullRequest
6 голосов
/ 10 января 2012

Как вы обходите нулевой WebOperationContext в методе службы WCF при тестировании метода с использованием NUnit

У меня есть проект модульного теста, использующий 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.

относительно WebOperationContext в методе SampleService.

1 Ответ

5 голосов
/ 10 января 2012

Как правило, вы хотели бы издеваться над 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;
    }
}

Конечно, существуют и другие способы настройки схемы внедрения зависимостей, в данном случае я просто использовал ее передачу в конструктор службы.

...