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

标签 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

我遇到的问题是我在尝试为 mailItemStub 引发 PropertyChange 事件的 Act 行收到运行时错误“参数计数不匹配”。 PropertyChange 事件只接受一个字符串类型的参数,由 Microsoft.Office.Interop.Outlook 命名空间中的委托(delegate) ItemEvents_10_PropertyChangeEventHandler(string Name) 定义。如果我删除 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()

最佳答案

two overloads Mock.Raise - 你需要传递一个 EventArgs,或者一个 params object[] 作为第二个 args参数。在您的情况下,您可以使用后者并传递已更改属性的 string name:

例如

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

更多here

关于c# - Moq 引发事件错误 - 参数计数不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21706090/

相关文章:

c# - "Object reference not set..."向另一个窗体添加控件时出现异常

c++ - 单元测试处理退化的网络堆栈、文件损坏和其他缺陷

python - 在 Google App Engine 上使用 Python 进行开发时,我应该使用什么模拟对象框架?

c# - ComboBox 不会在 DataSource 更改时自动更新?

c# - 维护类之间的双向关系

c# - 多线程访问内存

jquery将事件绑定(bind)到动态加载的html元素

c# - 检查是否已附加特定的事件处理程序方法

java - 模拟一个使用另一个类的 static void 方法的类

c# - 桌面屏幕覆盖 - 新窗体闪烁问题