Утверждают, что метод был вызван в модульном тесте

Я хочу утверждать, что был вызван мой реальный объект (тестируемая система). Вот мой тест

// 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). Вы можете проверять только методы на фальшивке, а не методы, которые принимают фальшивку в качестве аргумента.

Другие вопросы по тегам