2017-02-15 16 views
2

Я пытаюсь проверить, что метод Caliburn.Micro, PublishOnUIThread() называется:AssertWasCalled, когда есть «этот» параметр

public static class EventAggregatorExtensions 
{ 
...   
     public static void PublishOnUIThread(this IEventAggregator eventAggregator, object message); 
... 
} 

Я пытаюсь проверить, как это:

//assert 
_eventAggregator.AssertWasCalled(x => 
x.PublishOnUIThread(Arg<object> 
.Is.Anything)); 

но получите ошибку:

System.InvalidOperationException : When using Arg<T> , all arguments must be defined using Arg<T>.Is, Arg<T>.Text, Arg<T>.List, Arg<T>.Ref or Arg<T>.Out . 2 arguments expected, 1 have been defined.

Однако я не могу заставить метод принимать 2 параметра. Я новичок в тестировании, поэтому не знаю, как обойти это.

+2

Невозможно высмеять методы расширения в Rhino, http://stackoverflow.com/a/5488700/368552 Однако вы можете обернуть их интерфейсом и имитировать интерфейс –

ответ

2

Согласно рамочной документации, The Event Aggregator определяется следующим образом.

public interface IEventAggregator { 
    bool HandlerExistsFor(Type messageType); 
    void Subscribe(object subscriber); 
    void Unsubscribe(object subscriber); 
    void Publish(object message, Action<Action> marshal); 
} 

Как вы уже знаете, PublishOnUIThread является Event Aggregator Extension метод применяется к интерфейсу, который вызывает метод void Publish(object message, Action<Action> marshal);.

В этом случае вы можете подтвердить этот метод (IEventAggregator.Publish) при попытке протестировать публикацию события, поскольку вы не можете издеваться над методами расширения.

//assert 
_eventAggregator.AssertWasCalled(x => 
x.Publish(Arg<object>.Is.Anything, Arg<Action<Action>>.Is.Anything));