使用FakeItEasy,有没有办法伪造只写属性的setter
本文关键字:属性 setter 伪造 FakeItEasy 有没有 使用 | 更新日期: 2023-09-27 17:56:15
使用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
});
你可以这样做,但由于表达式树的限制(你不能在表达式中编写赋值),这不是很简单。解决方法是使用"高级"调用配置语法(如文档中所述):
A.CallTo(_myObject)
.Where(call => call.Method.Name == "set_Foo")
.Invokes((String foo) => {
//save off foo
});
话虽如此,拥有只写属性可能不是一个好主意;如果你可以设置它,你也应该能够得到它。如果确实希望它是只写的,请考虑使用方法而不是属性。
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
});