Cas*_*sey 4 c# events vsto moq mocking
我有以下场景:
public MailItemProxy(MailItem mailItem)
{
this.mailItem = mailItem;
this.mailItem.PropertyChange += this.MailItem_PropertyChange;
}
Run Code Online (Sandbox Code Playgroud)
我的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));
}
}
Run Code Online (Sandbox Code Playgroud)
我的目的是测试何时触发MailItem PropertyChange事件,测试中的类(MailItemProxy)已正确订阅该事件.
我使用的测试框架是Moq.
我得到的问题是我在Act行上收到运行时错误"参数计数不匹配",我尝试为mailItemStub引发一个PropertyChange事件.PropertyChange事件只接受一个类型为string的参数,该参数由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);
}
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
有两个重载的Mock.Raise-你要么需要传递的EventArgs,或params object[]作为第二个args参数.在您的情况下,您可以使用后者并传递string name更改的属性:
例如
mailItemStub.Raise(x => x.PropertyChange += (name) => { }, "FooBar");
Run Code Online (Sandbox Code Playgroud)
更多这里