【发布时间】:2014-05-15 04:41:22
【问题描述】:
我想断言调用了对我的真实对象(被测系统)的调用。这是我的测试
// 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,上面写着“指定的对象未被识别为假对象。”如何测试 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);
}
【问题讨论】:
-
你没有断言被测系统被调用。您断言被测系统调用了某些其他预期函数。
-
这不能回答我的问题“如何测试 MainViewModel 中的 LoadModels() 方法是否从 Loaded() 方法中调用?”
-
它不应该回答你的问题。它应该指出你做错了事。通常调用 LoadModels 的事实并不重要。重要的是,给定某些参数和模拟数据(排列),并且在调用 Loaded 方法之后(动作),从方法返回的值或存储在公共属性中的值是预期的值(断言)。
-
我在这里发现了另一个非常相似的问题stackoverflow.com/questions/17929758/…
-
@reggaeguitar 我建议您测试
contextFactory.GetContext()和db.Models都被调用,因为这是预期的功能,而不是对象的内部工作。换句话说,测试类似于Loaded loads the models from the database。
标签: c# fakeiteasy