Как unit test веб-служба С# с Visual Studio 2008

Как вы предполагаете unit test веб-службу на С# с Visual Studio 2008? Когда я создаю unit test, он добавляет фактическую ссылку на класс веб-службы вместо веб-ссылки. Он устанавливает атрибуты, указанные в:

http://msdn.microsoft.com/en-us/library/ms243399(VS.80).aspx#TestingWebServiceLocally

Тем не менее, он завершится без выполнения теста. Я попытался добавить вызов к WebServiceHelper.TryUrlRedirection(...), но вызов не нравится цели, поскольку он наследует от WebService, а не WebClientProtocol.

Ответ 1

То, что я обычно делаю, не проверяется непосредственно на веб-сервисе, а попытаться сделать как можно меньше кода в сервисе и вызвать другой класс, который выполняет всю реальную работу. Затем я пишу модульные тесты для этого другого класса. Оказывается, что класс иногда может быть полезен вне контекста веб-сервиса, так что таким образом - вы выигрываете дважды.

Ответ 2

Если вы пишете веб-сервис, попробуйте поместить всю логику в другой (проверяемый) уровень. Каждый метод Web должен иметь как можно более маленький код. Тогда у вас будет мало оснований проверять веб-метод напрямую, потому что вы можете протестировать нижележащие слои.

[WebMethod]
public void DoSomething()
{ 
   hander.DoSomething();
}

Если вы используете веб-метод, оберните созданный вызывающий объект в оболочку класса и реализуйте интерфейс для оболочки класса. Затем, в любое время, когда вам нужно позвонить в веб-службу, используйте интерфейс для вызова метода. Вы хотите использовать интерфейс, чтобы сделать оболочку класса заменяемой во время тестирования (используя Rhino Mocks, Moq или TypeMock).

Ответ 3

Вы можете добавить ссылку на службу в свой проект unit test или создать свой клиентский заглушку и поместить класс в проект unit test.

Ответ 5

Над моими модульными тестами веб-метода у меня есть следующее:

// TODO: Ensure that the UrlToTest attribute specifies a URL to an ASP.NET page (for example,
// http://.../Default.aspx). This is necessary for the unit test to be executed on the web server,
// whether you are testing a page, web service, or a WCF service.
[HostType("ASP.NET")]
[UrlToTest("http://localhost/MyWebService")]

В дополнение к обычному:

[TestMethod()]
[DeploymentItem("MyWebService.dll")]

Этот код возник из-за использования мастера Visual Studio 2008 Unit Test.

Ответ 6

Знайте, что существует два типа веб-службы. Те, кого вы пишете и хотите испытать, и те, которые вы потребляете. Для первого применяются вышеуказанные правила. Однако я бы сказал, что иногда я вижу, что разработчики тестируют внешние веб-службы. Логика диктует, что сторонняя служба ненадежна и поэтому требует гораздо большего тестирования. В объектно-ориентированном программировании лучше всего понять разделение беспокойства, о котором говорили нам Мартин Фаулер и другие. Это означает, что мы не должны тестировать системы, внешние по отношению к нашим.

Однако мне нравится писать классы-оболочки для обеспечения полезной функциональности в отношении сервисов. Например, Bing Maps имеет ряд удивительно мощных функций. Я пишу тесты против них только для того, чтобы они дали мне ожидаемые значения. Хотя это и не является исчерпывающим, дело в том, что если веб-служба умирает по какой-либо причине (истекает срок действия ключа аутентификации и т.д.), Я могу получить информацию об этом через тестовый сервер.