断言该方法在单元测试中被调用

时间:2014-05-13 20:53:45

标签: c# fakeiteasy

我想断言调用我的真实对象(被测系统)。这是我的测试

// 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表示&#34;指定的对象未被识别为假对象。&#34;如何测试从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 个答案:

答案 0 :(得分:1)

看起来您正在验证不属于假(vm.LoadModels)的方法(db)。你只能验证伪造的方法,而不是将假冒伪劣作为参数的方法。

答案 1 :(得分:0)

我最终将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);