使用FakeItEasy,是否有一种方法可以伪造只写属性的setter?

7
使用FakeItEasy,有没有一种方法可以伪造只写属性的setter?
我需要处理的接口看起来像这样:
Interface IMyInterface
{
   String Foo { set; }
}

我尝试过以下方法,但语法不正确。
IMyInterface _myObject = A.Fake<IMyInterface>();
A.CallTo(() => _myObject.Foo).Invokes((String foo) => {
   //save off foo
});

我也尝试过这个,但出现了语法错误。
IMyInterface _myObject = A.Fake<IMyInterface>();
A.CallTo(() => _myObject.set_Foo).Invokes((String foo) => {
   //save off foo
});
2个回答

7

你可以做到,但这并不是很直接,因为表达式树有限制(无法在表达式中编写赋值语句)。解决方法是使用“高级”调用配置语法(在文档中描述):

A.CallTo(_myObject)
 .Where(call => call.Method.Name == "set_Foo")
 .Invokes((String foo) => {
   //save off foo
 });

话虽如此,但是拥有只写属性可能不是一个很好的想法;如果你可以设置它,你也应该能够获取它。如果你真的希望它是只写的,请考虑使用方法而不是属性。


我同意您对只写属性的评估。在这种情况下,它确实应该是一个方法,但我无法更改它。 - Kevin Westwood

4
FakeItEasy增加了一个方法来处理这种情况,A.CallToSet
IMyInterface _myObject = A.Fake<IMyInterface>();

// Variant 1
A.CallToSet(() => _myObject.Foo).Invokes(call => {
   var foo = call.GetArgument<string>(0);
   // save off foo
});

// Variant 2
A.CallToSet(() => _myObject.Foo).Invokes((string foo) => {
   // save off foo
});

我不认为这个有效;一个没有get方法的属性无法转换为Expression<Func<T>> - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接