FakeItEasy 设置 属性 没有获取访问器?

FakeItEasy setting property with no get accessor?

我正在尝试使用 FakeItEasy 2.0.0 在一个简单的界面中伪造 属性:

public interface IPerson
{
    int Age { set; }
}

请注意,我没有 get 访问器。我要写的测试是:

public void SetsAge()
{
    var fakePerson = A.Fake<IPerson>();
    A.CallToSet(() => fakePerson.Age).To(42).MustHaveHappened();
    fakePerson.Age = 42;
}

但是包含 A.CallToSet 的行编译失败:

这是不言自明的,但令人困惑,因为我不是要获取 属性 的值。

我是否必须提供 get 访问器才能编译(即使我不需要 get 访问器)? 在这种情况下它需要 get 访问器 的原因是什么(当我将 MustHaveHappened 替换为 DoesNothing 时会发生相同的编译器错误)? 还是我做错了什么?

或许我不应该为此失眠,而且首先 do the right thing

我是否必须提供 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 表达式中使用 =,所以没有简单的方法来引用 属性 setter。在 2.0 中,我们添加了 A.CallToSet 以允许您使用 getter 作弊,但是当然它只有在有 getter.

时才有效

我们还没有想出一个优雅的方式来引用 getterless setter,所以你必须使用上面 A.CallTo 的强大版本。

还是我做错了什么?

嗯,除了引用属性的问题,整个A.CallTo…MustHaveHappend()必须在fakePerson.Age = 42之后发生,否则会报错,因为你没有'尚未将 fakePerson.Age 设置为 42