我试图使用FakeItEasy 2.0.0在一个简单的界面中伪造一个属性:
public void SetsAge()
{
var fakePerson = A.Fake<IPerson>();
A.CallToSet(() => fakePerson.Age).To(42).MustHaveHappened();
fakePerson.Age = 42;
}
请注意,我没有get访问者。我试图写的测试是:
onScale()
但包含A.CallToSet的行无法编译:
这是相当不言自明的,但令人困惑,因为我并没有试图获得该物业的价值。
我是否必须提供一个get访问器来进行编译(即使我不想要一个get访问器)? 在这种情况下它需要get访问器的原因是什么(当我用DoesNothing替换MustHaveHappened时会发生相同的编译器错误)? 还是我做了一些根本错误的事情?
或许我不应该在这个和do the right thing之间失去太多的睡眠?
答案 0 :(得分:3)
我是否必须提供get访问器才能进行编译?
不,你可以使用
A.CallTo(fakePerson).Where(call => call.Method.Name == "set_Age" &&
call.GetArgument<int>(0) == 42)
.MustHaveHappened();
Specifying a call to any method or property中记录了这一点。
它需要get访问器的原因是什么?
原因是因为你不能在lamdba表达式中使用=
,所以没有简单的方法来引用属性设置器。在2.0中,我们添加了A.CallToSet
以允许您使用getter作弊,但当然只有在有吸气剂时它才有效。
我们还没有提出一种优雅的方式来引用一个没有getter的setter,所以你必须使用上面强大的A.CallTo
版本。
还是我做了一些根本错误的事情?
好吧,除了引用该属性的问题之外,整个A.CallTo…MustHaveHappend()
必须在fakePerson.Age = 42
之后发生,否则它会报告失败,因为您还没有设置{ {1}}至fakePerson.Age
。