2016-02-24 28 views
1

我正在使用FakeItEasy来检查对属性的公共setter方法的调用是否已被调用。在C中获取属性设置器的方法名称#

该属性称为Description,而且目前我正在测试它像这样:

A.CallTo(model) 
    .Where(x => x.Method.Name.Equals("set_Description")) 
    .WithAnyArguments() 
    .MustHaveHappened(); 

这个工作在功能上,使用魔法字符串方法名,不过缺点是,如果我重构该属性的名称,测试将失败,我将不得不在所有测试中手动更改字符串。

理想情况下,我想知道的方式在这片伪做它像:

var setterName = model.GetType() 
         .SelectProperty(x => x.Description) 
         .GetSetterName(); 

A.CallTo(model) 
    .Where(x => x.Method.Name.Equals(setterName)) 
    .WithAnyArguments() 
    .MustHaveHappened(); 

这样,如果我用鼠标右键单击重构Description属性,测试将不再需要要被更新。我怎样才能做到这一点?

+0

顺便说一句,如果你这么倾向,你可以在这里省略'WithAnyArguments'。 –

+0

这是为什么@BlairConrad?如果我没有具体声明约束条件,是否带有'WithAnyArguments'? –

+1

这正是为什么。嗯。我不能把@JamesMonger放在这里。看起来在一开始。啊。因为“邮件所有者将永远被通知”。你学到的东西。 –

回答

3

你的伪代码是在正确的轨道上。

var setterName = model.GetType() 
        .GetProperty(nameof(Description)) 
        .GetSetMethod(); 

注意nameof只适用于C#6

+0

感谢您的帮助,@Dennis_E。我选择了Terje的答案,因为它更简洁一些,不过我很感谢你花时间回答。我也非常感谢你的更强大,因为它甚至不包含'set_'字符串。再次感谢! –

1

注意,作为FakeItEasy 2.0.0,如果二传手有一个getter,以及,你可以使用新的A.CallToSet method

A.CallToSet(() => model.Description).MustHaveHappened();