Абстрагирование событий веб-сервиса от моего - PullRequest
0 голосов
/ 03 апреля 2012

При извлечении вызовов веб-службы в абстракцию, чтобы их можно было легко протестировать, не полагаясь на то, что веб-служба подключена к сети, как я могу абстрагировать обработчики событий, автоматически вызываемые службой? Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку API, который я использую (EWS), имеет все внутренние классы, я не могу их создать. Это превращается в проблему при модульном тестировании, потому что я не могу сказать, например, когда событие запускается, что оно должно делать x, y и z.

Как я могу извлечь эти обработчики событий своими собственными, чтобы я мог легко издеваться над ними?

1 Ответ

1 голос
/ 03 апреля 2012

Вам нужно будет обернуть класс в свой собственный класс, поддерживающий интерфейс.Например, если использование вашего сервиса выглядит следующим образом:

var service = new SomeService();
service.SomeEvent =+ (o, e) => DoSomething(e);
service.DoStuff();

Вы создадите интерфейс:

public interface ISomeService
{
    event EventHandler SomeEvent;
    void DoStuff();
}

И ваш реализующий класс:

public class SomeServiceWrapper : ISomeService
{
    private readonly SomeService _containedService;

    public event EventHandler SomeEvent;

    public SomeServiceWrapper()
    {
        _containedService = new SomeService();
        _containedService.SomeEvent += (o, e) => RaiseSomeEvent(e);
    }

    public void DoStuff()
    {
        _containedService.DoStuff();
    }

    private void RaiseSomeEvent(EventArgs e)
    {
        EventHandler evt = SomeEvent;
        if (evt != null)
        {
            evt(this, e);
        }
    }
}

Тогдавы можете создать пустышку ISomeService с помощью насмешки или вашего собственного класса пустышки и использовать в работе ISomeService экземпляр SomeServiceWrapper.

Надеюсь, что это поможет.

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