![](/img/trans.png)
[英]Should I assert that a dependency's method is called in every unit test for a given method?
[英]Assert that method was called in a unit test
我想斷言對我的真實對象(被測系統)的調用已被調用。 這是我的測試
// Arrange
var contextFactory = A.Fake<IContextFactory>();
var db = A.Fake<IDatabase>();
A.CallTo(() => contextFactory.GetContext()).Returns(db);
var vm = new MainViewModel(contextFactory);
// Act
vm.Loaded();
// Assert
A.CallTo(() => vm.LoadModels(db)).MustHaveHappened();
我收到一個ArgumentException,內容為“指定的對象未被識別為偽對象”。 如何測試是否從Loaded()
方法調用了MainViewModel中的LoadModels()
Loaded()
方法?
編輯
我這樣做的原因是因為在應用啟動時,Loaded()方法調用了許多其他方法,並且我不想為每次測試設置所有其他內容,我只想確保所有正確的方法都會被調用,然后分別進行測試。 我願意提出更好的解決方案。
這是Loaded和LoadModels方法
internal virtual void Loaded()
{
using (var db = _contextFactory.GetContext())
{
LoadModels(db);
// bunch of other method calls
}
}
internal virtual void LoadModels(IDatabase db)
{
Models = new ObservableCollection<Model>(db.Models);
}
看起來您正在驗證的方法( vm.LoadModels
)不是偽造的( db
)的一部分。 您只能驗證偽造品上的方法,而不能驗證恰好以偽造品為參數的方法。
我最終將LoadModels()
的功能移至另一個實現IStartupDataLoader
類,然后我就可以像這樣測試它
// Arrange
var sdl = A.Fake<IStartupDataLoader>();
var exp = A.Fake<ObservableCollection<Model>>();
A.CallTo(() => sdl.LoadModels()).Returns(exp);
var sut = new MainViewModel(sdl);
// Act
sut.Loaded();
// Assert
Assert.That(exp == sut.Models);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.