在c#中获取属性setter的方法名称

时间:2016-02-24 11:03:48

标签: c# .net reflection mocking fakeiteasy

我正在使用FakeItEasy检查是否已调用对属性的公共setter方法的调用。

该属性名为Description,目前我正在测试它:

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

这在功能上有效,但是使用魔术字符串作为方法名称的缺点是,如果我重构属性的名称,测试将失败,我将不得不手动更改所有测试中的字符串。 / p>

理想情况下,我想知道一种方法,就像在这段伪代码中一样:

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

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

这样,如果我右键单击重构Description属性,则不需要更新测试。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

您的伪代码在正确的轨道上。

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

请注意,nameof仅适用于C#6。

答案 1 :(得分:2)

我认为您可以使用gl.requestLayout()关键字执行此操作: https://msdn.microsoft.com/en-us/library/dn986596.aspx

所以我猜它会像

nameof

答案 2 :(得分:1)

请注意,从FakeItEasy 2.0.0开始,如果setter也有getter,你可以使用新的A.CallToSet method

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