Как делать макеты для веб-тестов? - PullRequest
3 голосов
/ 15 января 2011

Я хочу написать несколько веб-тестов (через веб-сервер WatiN / Selenium + CassiniDev) для моего веб-приложения asp.net.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, что делать в таких ситуациях: есть страница, на которой пользователь может нажать на кнопку, чтобы вызвать какой-либо сторонний сервис. В моем веб-тесте я хочу создать макет этого сервиса, который всегда будет возвращать статическое значение (какое-то значение в этом тестовом примере и другое значение в другом тестовом примере).

Как я могу это сделать?

В настоящее время я использую контейнер IoC / DI Microsoft Unity. И мои страницы получают его зависимости способом, описанным в http://msdn.microsoft.com/en-us/library/ff664622%28v=pandp.50%29.aspx.

Единственное решение, которое приходит мне в голову: поместите все зависимости в web.config для каждого теста и скопируйте необходимый web.config в SetUp теста. Это решение совершенно болезненно!

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Я использую WatiN и Cassini-dev в своих интеграционных тестах, и мне приходилось сталкиваться с подобными проблемами. В моем установочном приспособлении я развернул свое веб-приложение Asp.Net во временной папке в моей тестовой папке, что позволяет мне поиграться с конфигурацией перед запуском cassini-dev. Я использую Windsor для своего CI, который позволяет мне изменять введенные компоненты на уровне конфигурации. Вы также можете достичь этого с помощью Unity .

Если служба, на которую вы ссылаетесь, является веб-службой, вы просто макетируете веб-службу, используя интерфейс, для которого вы кодировали.

Вот шаги, которые я предпринимаю при выполнении интеграционных тестов:

  1. Создать временный веб-каталог
  2. Публикация веб-приложения Asp.Net во временном каталоге (для этого я использую MSBuild)
  3. Развертывание временной базы данных (используя проекты MSbuild и базы данных, но это можно сделать несколькими способами)
  4. Развертывание базы данных временного членства (см. Мой пост в блоге о том, как это сделать в коде)
  5. Обновите web.config развернутого веб-приложения Asp.Net, чтобы он указывал на временные базы данных и изменял любые другие параметры, относящиеся к тестированию.
  6. Запустите сайт, используя Cassini-Dev. Я также обратился к сайту с запросом http, чтобы убедиться, что сайт работает, прежде чем выполнять какие-либо тесты.

Запустите тесты.

После выполнения тестов вы должны очистить.

  1. Стоп Кассини-Дев
  2. Удалить папку временного хостинга
  3. Удалить временные базы данных. Я использую SMO-объекты Sql-сервера, которые позволяют мне запрашивать Sql-сервер, который я использую для удаления любых старых баз данных, которые остались лежать после любых ранее неудачных тестовых прогонов.

Как развернуть сайт с помощью MSbuild в коде

var properties = new Dictionary<string, string>
{
    {"Configuration", isDebug ? "Debug" : "Release"},
    {"WebProjectOutputDir", tempHostingDirectory.FullName},
    {"DeployToDatabase", "true"},
    {"OutDir", Path.Combine(tempHostingDirectory.FullName, "bin\\")}
};

using (var engine = new ProjectCollection(properties))
{
    engine
        .LoadProject(<web project path>, "4.0")
                .Build(new[] {"Build", "ResolveReferences", "_CopyWebApplication"});
}

Использование раздела конфигурации Unity: http://www.pnpguidance.net/Post/UnityContainerUnityConfigurationSectionAppConfigWebConfig.aspx

Создание базы данных членства asp.net в коде: http://bronumski.blogspot.com/2011/06/generating-creating-aspnet-application.html

Msbuild ProjectCollection на MSDN: http://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.projectcollection.aspx

0 голосов
/ 31 января 2011

Похоже, вы пытаетесь издеваться над веб-сервисом. Веб-сервисы обычно наследуются от MarshalByRefObject, это означает, что вы можете создать макет, унаследовав от RealProxy, чтобы создать прозрачный прокси, который притворяется веб-сервисом:

class Mock : RealProxy
{
    public Mock()
        : base(typeof(IStuff)) { }

    public IStuff GetStuff()
    {
        return (IStuff)GetTransparentProxy();
    }

    public override IMessage Invoke(IMessage msg)
    {
        IMethodCallMessage message = (IMethodCallMessage)msg;

        // the message object provides the MethodInfo that was called
        // as well as the arguments.

        // <Insert logic here>

        return new ReturnMessage(new NotImplementedException("comming soon to a test near you ..."), message);
    }
}

Я считаю, что NMock2 использует RealProxy для своих издевательств, поэтому вы должны иметь возможность использовать его вместо насмешки над веб-службой.

...