Moq引发事件错误 - 参数计数不匹配

时间:2014-02-11 15:31:14

标签: c# events mocking vsto moq

背景

我有以下情况:

  • MailItemProxy 类,其构造函数的单个参数类型为 MailItem (MailItem实际上是Microsoft.Office.Interop.Outlook命名空间的一部分)
  • 在MailItemProxy的构造函数中,注册了一个名为 PropertyChange 的事件(来自Outlook MailItem类):
public MailItemProxy(MailItem mailItem)
{
    this.mailItem = mailItem;
    this.mailItem.PropertyChange += this.MailItem_PropertyChange;
}

我的 MailItemProxy 类实现了INotifyPropertyChanged,因此有自己的 PropertyChanged 事件(注意这是“PropertyChanged”而不是Outlook MailItem自己的“PropertyChange”时态。)

* MailItem_PropertyChange *事件处理程序如下:

 private void MailItem_PropertyChange(string name)
 {
     if (this.PropertyChanged != null)
     {
         this.PropertyChanged(this, new PropertyChangedEventArgs(name));
     }
 }

意图

我的目的是测试何时触发MailItem PropertyChange事件,测试中的类(MailItemProxy)已正确订阅该事件。

我使用的测试框架是 Moq

我得到的问题是我在Act行上收到运行时错误“参数计数不匹配”,我尝试为mailItemStub引发一个PropertyChange事件。 PropertyChange事件只接受一个由Microsoft.Office.Interop.Outlook命名空间中的委托ItemEvents_10_PropertyChangeEventHandler(字符串名称)定义的字符串类型的参数。如果我删除mailItemProxy的最后两个Arrange行,那么Act行由于某种原因运行正常,但我显然需要代理,因为这是我正在测试的类。

我收到此错误的任何想法?

 [TestMethod]
 public void PropertyChanged_WhenMailItemPropertyChange_EventIsCalled()
 {
     // Arrange
     bool eventDispatched = false;
     var mailItemStub = new Mock<MailItem>();
     var mailItemProxy = new MailItemProxy(mailItemStub.Object);
     mailItemProxy.PropertyChanged += (sender, args) => { eventDispatched = true; };

     // Act
     mailItemStub.Raise(x => x.PropertyChange += (name) => { });

     // Assert
     Assert.IsTrue(eventDispatched);
 }

堆栈跟踪

Test Name:  PropertyChanged_WhenMailItemPropertyChange_EventIsCalled
Test Outcome:   Failed
Test Duration:  0:00:00.2764026

Result Message: 
Test method UI.Office.UnitTests.MailItemProxyTest.PropertyChanged_WhenMailItemPropertyChange_EventIsCalled threw exception: 
System.Reflection.TargetParameterCountException: Parameter count mismatch.
Result StackTrace:  
at Moq.Mock`1.Raise(Action`1 eventExpression, Object[] args)
   at UI.Office.UnitTests.MailItemProxyTest.PropertyChanged_WhenMailItemPropertyChange_EventIsCalled()

1 个答案:

答案 0 :(得分:5)

Mock.Raisetwo overloads - 您需要传递EventArgsparams object[]作为第二个args参数。在您的情况下,您可以使用后者并传递更改的属性的string name

e.g。

 mailItemStub.Raise(x => x.PropertyChange += (name) => { }, "FooBar");

更多here