2015-03-27 5 views
1

Прокси-серверу для веб-службы требуется единичное тестирование без - очевидно - попадание в веб-службу.Mocking Action <T> с NSubstitute

Это метод, который я хотел бы кастрировать -

public void Invoke(Action<T> action) 
{ 
    Task.Run(async()=> { await _invoker.Invoke(this, action); }).Wait(); 
} 

Есть ли способ, чтобы издеваться параметр Action, используя NSubstitute? Я работал по линиям использования

_proxy.When(x => x.Invoke($args_go_here)).Do(x => _counter++); 

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

+1

Вы можете 'Заменить. Для >()' если это помогает? С точки зрения насмешек 'Invoke', убедитесь, что вы заменили интерфейс прокси, или сделайте' Invoke' виртуальным, чтобы NSubstitute мог перехватить вызовы на него. –

+0

Substitute.For >() создает синтаксическую ошибку - ah, no T allowed, can '; t generic. Попался. –

+0

Маркировка Вызывать как виртуальную, полностью решить проблему. Дэвид, пожалуйста, отправьте свой комментарий в качестве ответа, чтобы я мог отметить его как правильно? –

ответ

1

Как Дэвид рекомментирует (см. Комментарии к вопросу), я публикую то, что на самом деле решило мою проблему здесь.

Проблема заключалась в проверке того, что код для вызова служб WCF был фактически запущен, отправка правильного материала и т. Д. Я бы ОЧЕНЬ СИЛЬНО рекомендовал, чтобы кто-то, спустившийся по этому маршруту, делал это в стиле TDD в качестве переоснащения модульных тестов над чужой работой код не является приятным опытом.

В этом случае прокси не были автогенерированы, но унаследованы от одного класса ProxyBase, который раскрыл метод Invoke (Действие), упомянутый выше.

public void Invoke(Action<T> action) 
{ 
    Task.Run(async()=> { await _invoker.Invoke(this, action); }).Wait(); 
} 

Моя первая мысль была издеваться действие (и я в конечном итоге делает это), но это порождало Сервис не найден ошибки, совершенно правильно.

В конце концов, я в конечном итоге с NSubstitute Automock из (определенного) класса Proxy заклинателя, созданный фактически проходящими зависимостей в конструктор, как так -

var myProxyMock = Substitute.For<MyProxy>(dependency1, dependency2); 

и изменение метода базового Invoke к виртуальной, так что заменитель может заменить его, например, так -

public virtual void Invoke(Action<T> action) 
{ 
    Task.Run(async()=> { await _invoker.Invoke(this, action); }).Wait(); 
} 

Теперь, подставляя действия, я мог проверить окружающий код эффективен.

var actionSubstitute = Substitute.For<Action<MyService>>(); 

и применять соответствующие возвращаемые значения, указать.

так eventuially, у нас -

myProxyMock.When(x => x.Invoke(Arg.Any<Action<MyService>>).Do(x => _counter++); 

Проблема решена. Большое спасибо, Дэвид.

Смежные вопросы