我寫單元測試,並試圖提高從抽象類模擬事件時收到異常接口中聲明的事件。下面是示例代碼:C#和起訂量,提高從抽象類模擬
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
使用模擬和事件復活了就好了,但PropertyChangedMapper
裏面我需要的,如果使用Mock<INotifyPropertyChanged>
編輯給發件人轉換爲AbstractBase
它失敗: 按使用Mock.As<>()
建議似乎是正確的方式去,唯一的問題是上面從notificationMock
上升事件無關與對象的原始模擬。代碼:
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"));
只要有人打電話,不管它叫哪一個。我的猜測是你可以設置其中一個或另一個。但建立兩者都會導致模擬內部選擇一個。 –
欲瞭解更多證明,不要緊被稱爲,認爲類型系統的工作方式類似於虛擬成員和他們的覆蓋。例如,如果您添加到AbstractBase爲EntityObject的INPC事件的覆蓋,是沒有辦法的任何代碼消耗AbstractBase強制EntityObject的版本被調用。即使您投射到EntityObject,也會調用AbstractBase成員。一旦基礎成員被覆蓋,只有派生類可以訪問原始基礎成員。 –