当有“this”参数时,AssertWasCalled

时间:2017-02-15 19:20:43

标签: c# unit-testing nunit caliburn.micro rhino-mocks

我正在尝试测试Caliburn.Micro方法,PublishOnUIThread()被调用:

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:使用Arg<T>时,所有参数   必须使用Arg<T>.Is, Arg<T>.Text, Arg<T>.List, Arg<T>.Ref or Arg<T>.Out定义。预期有2个参数,1个已被定义。

但是,我不能强制该方法采用2个参数。我是新手测试所以我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分: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是应用于调用void Publish(object message, Action<Action> marshal);方法的接口的Event Aggregator Extension方法。

在这种情况下,您可以在尝试测试发布事件时声明该方法(IEventAggregator.Publish),因为您无法模拟扩展方法。

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