在 c# 中获取属性资源库的方法名称

本文关键字:方法 资源库 属性 获取 | 更新日期: 2023-09-27 18:36:09

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

该属性称为 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 属性,则不需要更新测试。我该怎么做?

在 c# 中获取属性资源库的方法名称

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

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

请注意,nameof仅在 C# 6 中可用。

我认为您可以使用nameof关键字来做到这一点:https://msdn.microsoft.com/en-us/library/dn986596.aspx

所以我想它会是这样的

.Where(x => x.Method.Name.Equals("set_" + nameof(x.Description))

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

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