gpt4 book ai didi

c# - 模拟事件处理器

转载 作者:太空狗 更新时间:2023-10-29 22:23:23 25 4
gpt4 key购买 nike

定义接口(interface)

 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);

失败了。只是不调用委托(delegate)。请帮我解决这个问题。

最佳答案

你举的例子不清楚。您实际上是在测试自己的模拟。

在将模拟代理作为依赖项传递给被测对象的情况下,您无需设置事件处理程序,只需引发它即可。

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() 来记录“在局部标志变量中处理”事件。

关于c# - 模拟事件处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com