Тестирование методов WCF с помощью Nunit, но WebOperationContext имеет значение null
Как вы обходите нулевой 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 ответ
Как правило, вы хотели бы издеваться над 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;
}
}
Есть, конечно, и другие способы настройки схемы внедрения зависимостей, в данном случае я просто использовал ее передачу в конструктор службы.