【发布时间】:2013-07-29 13:56:14
【问题描述】:
使用 FakeItEasy,我如何检查我的对象的方法是否在同一个对象上调用了另一个方法?
测试:
[TestMethod]
public void EatBanana_CallsWillEat()
{
var banana = new Banana();
var myMonkey = new Monkey();
myMonkey.EatBanana(banana);
//this throws an ArgumentException, because myMonkey is a real instance, not a fake
A.CallTo(() => myMonkey.WillEat(banana)
.MustHaveHappened();
}
班级:
public class MyMonkey {
private readonly IMonkeyRepo _monkeyRepo;
public MyMonkey(IMonkeyRepo monkeyRepo) {
_monkeyRepo = monkeyRepo;
}
public void EatBanana(Banana banana) {
//make sure the monkey will eat the banana
if (!this.WillEat(banana)) {
return;
}
//do things here
}
public bool WillEat(Banana banana) {
return !banana.IsRotten;
}
}
我愿意接受建议。如果我说这一切都错了,请告诉我。
【问题讨论】:
-
据我了解,这并不是 FIE 的真正用途。 FIE 提供了假对象,因此您的生产代码可以更容易地被戳和戳。正如您所指出的,您没有假货。根据我的经验,这种测试通常不是一个好主意。您的 MyMonkey 类应该是一个相当独立的单元,并且您最好在命令吃香蕉时测试它的整体行为,而不是担心它是否调用了自己的方法。比如,你能根据“// do things here”中的线索判断香蕉是否被吃掉了吗?
-
@BlairConrad 在我的真实场景中,WillEat 更复杂,并且有自己的测试,这只是 EatBanana 的测试之一。在这个测试中,如果我让 EatBanana 调用真正的 WillEat,我会不会在一次测试中测试两个功能?那么,如果 WillEat 发生变化,它可能会打破该测试,这是个坏消息,对吧?
-
我明白你的意思。这很棘手。如果
WillEat存在于另一个对象上,我们都会敦促伪造该对象并将其注入MyMonkey(听起来很痛苦)。我只能说,我认为最好的默认位置是尝试从外部测试MyMonkey,依赖于客户的可观察结果。但是,您已经深思熟虑,并找到了一种解决方案,可以减轻您的痛苦并减少测试次数以及给定的测试次数。你最了解代码,所以如果它适合你……我只是想让你知道替代方案。
标签: c# unit-testing fakeiteasy