Утверждают, что метод был вызван в модульном тесте
Я хочу утверждать, что был вызван мой реальный объект (тестируемая система). Вот мой тест
// 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, которое говорит: "Указанный объект не распознается как поддельный объект". Как мне проверить, что LoadModels()
метод в моем MainViewModel вызывается из 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);
}
2 ответа
Я закончил тем, что перенес функциональность 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);
Похоже, вы проверяете метод (vm.LoadModels
) это не является частью подделки (db
). Вы можете проверять только методы на фальшивке, а не методы, которые принимают фальшивку в качестве аргумента.