我想断言调用我的真实对象(被测系统)。这是我的测试
// 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);
}
答案 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);