使用FakeItEasy,有没有办法伪造只写属性的setter?

时间:2016-07-08 21:22:46

标签: c# fakeiteasy

使用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 个答案:

答案 0 :(得分:4)

你可以这样做,但由于表达式树的限制(你不能在表达式中写一个赋值),它不是很直接。解决方法是使用&#34; advanced&#34;调用配置语法(描述为in the docs):

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

话虽这么说,拥有一个只写属性可能不是一个好主意;如果你可以设置它,你也应该能够得到它。如果您真的希望它是只写的,请考虑使用方法而不是属性。

答案 1 :(得分:1)

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
});
相关问题