6

定义了一个接口

 public interface IHandlerViewModel {
         EventHandler ClearInputText { get; } 
}

我想测试 ClearInputText 是否被某种方法调用。为此,我做这样的事情

SomeType obj=new SomeType();
bool clearCalled = false;
var mockHandlerViewModel=new Mock<IHandlerViewModel>();
mockHandlerViewModel.Setup(x => x.ClearInputText).Returns(delegate { clearCalled = true; });

obj.Call(mockHandlerViewModel.Object);//void Call(IHandlerViewModel);
Assert.IsTrue(clearCalled);

失败了。只是没有调用委托。请帮我解决一下这个。

4

1 回答 1

16

你举的例子不清楚。你本质上是在测试你自己的模拟。

在模拟代理作为依赖项传递给被测对象的场景中,您无需设置事件处理程序,而是引发它。

var mockHandlerViewModel = new Mock<IHandlerViewModel>();
var objectUnderTest = new ClassUnderTestThatTakesViewModel(mockHandlerViewModel.Object);
// Do other setup... objectUnderTest should have registered an eventhandler with the mock instance. Get to a point where the mock should raise it's event..

mockHandlerViewModel.Raise(x => x.ClearInputText += null, new EventArgs());
// Next, Assert objectUnderTest to verify it did what it needed to do when handling the event.

模拟要么使用 .Raise() 替换事件源,要么替换一个对象,该对象将消耗另一个被测类的事件(断言事件已引发),在这种情况下,您使用 .Callback() 记录“处理”本地标志变量中的事件。

于 2012-10-22T23:54:26.387 回答