簡體   English   中英

斷言該方法已在單元測試中調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM