FakeItEasy设置属性没有get访问器?

时间:2016-06-14 10:09:19

标签: fakeiteasy

我试图使用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的行无法编译:

enter image description here

这是相当不言自明的,但令人困惑,因为我并没有试图获得该物业的价值。

我是否必须提供一个get访问器来进行编译(即使我不想要一个get访问器)? 在这种情况下它需要get访问器的原因是什么(当我用DoesNothing替换MustHaveHappened时会发生相同的编译器错误)? 还是我做了一些根本错误的事情?

或许我不应该在这个和do the right thing之间失去太多的睡眠?

1 个答案:

答案 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