【问题标题】:Using FakeItEasy, is there a way to fake the setter of a write only property?使用 FakeItEasy,有没有办法伪造只写属性的设置器?
【发布时间】:2020-07-08 16:27:18
【问题描述】:

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

我必须使用的界面类似于:

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
});

【问题讨论】:

    标签: c# fakeiteasy


    【解决方案1】:

    您可以这样做,但由于表达式树的限制(您不能在表达式中编写赋值),这不是很简单。解决方法是使用“高级”调用配置语法(描述为in the docs):

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

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

    【讨论】:

    • 我也同意您对只写属性的评估。在这种情况下,它确实应该是一个方法,但我不能改变它。
    【解决方案2】:

    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
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多