Как 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.
Ответ 4
У меня также были проблемы с этим, поэтому я использую этот обходной путь:
http://techkn0w.wordpress.com/2009/07/01/unit-testing-an-asmx-web-service-in-visual-studio-2008/
Ответ 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 имеет ряд удивительно мощных функций. Я пишу тесты против них только для того, чтобы они дали мне ожидаемые значения. Хотя это и не является исчерпывающим, дело в том, что если веб-служба умирает по какой-либо причине (истекает срок действия ключа аутентификации и т.д.), Я могу получить информацию об этом через тестовый сервер.