C#和Moq,引发在抽象类mock的接口中声明的事件
发布时间:2020-12-15 07:40:44 所属栏目:百科 来源:网络整理
导读:我正在编写单元测试并在尝试从抽象类mock中引发事件时收到异常.以下是示例代码: public abstract class AbstractBase : EntityObject {} [TestMethod] public void MyTest() { var mock = new MockAbstractBase(); var notificationMock = entityMock.AsINo
我正在编写单元测试并在尝试从抽象类mock中引发事件时收到异常.以下是示例代码:
public abstract class AbstractBase : EntityObject {} [TestMethod] public void MyTest() { var mock = new Mock<AbstractBase>(); var notificationMock = entityMock.As<INotifyPropertyChanged>(); var propertyChangedMapper = new PropertyChangedMapper(); bool eventReceived = false; propertyChangedMapper.MyPropertyChanged += (sender,eventArgs) => { eventReceived = true; }; propertyChangedMapper.Subscribe((AbstractBase)notificationMock.Object); Assert.IsFalse(eventReceived); notificationMock.Raise(e=>e.PropertyChanged += null,new PropertyChangedEventArgs("Property1")); Assert.IsTrue(eventReceived); } 显然我可以在INotifyPropertyChanged上使用mock并且事件上升很好,但是在PropertyChangedMapper中我需要将发送者强制转换为AbstractBase,如果使用Mock< INotifyPropertyChanged> 编辑: notificationMock.Object.PropertyChanged += (s,e) => { var result = "this one is fired as it should"; }; mock.Object.PropertyChanged += (s,e) => { var result = "this one is not called but is actually what I need"; }; notificationMock.Raise(e => e.PropertyChanged += null,new PropertyChangedEventArgs("Property1")); 解决方法
如果你让你的模拟成为一个多模拟,你可以做所需的演员表.由于Moq模拟通过泛型参数绑定到单个类型,因此必须显式逐步向模拟中添加其他接口或超类,然后在测试中使用最终产品.下面是一个如何执行此操作的简单示例.
var baseMock = new Mock<AbstractBase>(); var inpcMock = baseMock.As<INotifyPropertyChanged>(); // ...setup event... propertyChangedMapper.Subscribe(inpcMock.Object); // ... assertions ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读