NFluent 只检查一个对象的几个成员

NFluent Check only a few members of an object

我正在使用 Specflow 3, to test a method that query data in db and I use NFluent 编写单元测试以获得良好的断言方法。

有什么方法可以顺利地测试一个对象的几个成员的相等性吗?

有一个名为 HasFieldsWithSameValues 的方法,但我在他们的 wiki 中没有找到任何解释如何彻底使用它的方法。我们可以链接一个 Excluding("fieldNames","etc",...) 方法,但我必须排除超过 20 个 public 成员。

这是我的功能文件(功能场景,Gherkin 语法)

Scenario: TimeSheet_001_SearchForExistingTimeSheet
    When I search for timesheet with id 31985
    Then I get the following timesheet
    | id    | StatutPaid | StatutFact |
    | 31985 | Paid       | None       |

然后我有这个代码块调用的方法:

    [When(@"I search for timesheet with id (.*)")]
    public void WhenJeChercheLeReleveDHeureAvecLId(int id)
    {
        var result = GetTimeSheetDetailQuery(id);
        timeSheetContext.Result = result;
    }

    [Then(@"I get the following timesheet")]
    public void ThenJObtiensLeReleveDHeureSuivant(Table table)
    {
        var sut = table.CreateInstance<TimeSheetDetail>();
        Check.That(sut).HasFieldsWithSameValues<TimeSheetDetail>().Fields.IsEqualTo(timeSheetContext.Result);
    }

问题是 TimeSheetDetail 是一个非常详细的对象,我只需要为这个测试案例检查 3 个成员。 有没有办法写例如

//this
Check.That(sut)
.HasFieldsWithSameValues<myType>("Id","StatusPaid","StatusFact")
.IsEqualTo(timeSheetContext.Result);

//instead of this
Check.That(sut.Id).IsEQualTo(timeSheetContext.Result.Id);
Check.That(sut.StatusPaid).IsEQualTo(timeSheetContext.Result.StatusPaid);
Check.That(sut.StatusFact).IsEQualTo(timeSheetContext.Result.StatusFact);

从事物的声音来看,NFluent 不直接支持您正在寻找的确切功能。这听起来很适合使用 C# 扩展方法,幸运的是 NFluent supports extension methods

这个想法的要点是你可以实现一个包含你试图拥有的逻辑的方法,并且这个方法可以被 NFluent 直接调用以实现 的语法更接近 您正在寻找的东西(如果不是您正在寻找的东西)。实现这样的方法后,你就可以这样调用了:

Check.That(sut).HasFieldsWithSameValues(timeSheetContext.Result, "Id", "StatusPaid", "StatusFact");

扩展方法的原型是这样的:

public static ICheckLink<ICheck<Object>> HasFieldsWithSameValues(this ICheck<Object> check, myType myObject, params string[] fieldsList)

请注意,您可能可以获得您正在寻找的 精确 语法,但您需要做更多的工作才能弄清楚如何在扩展方法的上下文中执行此操作。

了解有关 C# 扩展方法的更多信息 here

查找如何实现 NFluent 扩展方法的示例 here

您可以使用匿名类型作为期望值来获得期望的结果。

Check.That(sut).HasFieldsWithSameValues(new {Id=1, StatusPaid = true, StatusFact = "Paid"});

这样可以集中比较感兴趣的领域

如果你需要做很多这样的检查,你应该考虑为此创建一个简单的专用类型而不是匿名类型。