NFluent仅检查对象的几个成员

时间:2019-09-05 11:19:35

标签: c# unit-testing mstest specflow

我正在用Specflow 3编写单元测试,以测试一种查询db中数据的方法,并且我使用NFluent来使用漂亮的断言方法。

有什么方法可以平滑地测试对象的几个成员之间的相等性?

有一种名为 HasFieldsWithSameValues 的方法,但我在他们的Wiki中找不到任何内容来解释如何彻底使用它。我们可以链接一个Exclusion(“ fieldNames”,“ etc”,...)方法,但是我必须排除20个以上的公共成员。

这是我的功能文件(功能场景,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       |

然后我有此代码bloc调用的方法:

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

2 个答案:

答案 0 :(得分:1)

从实际情况看,NFluent不直接支持您正在寻找的确切功能。这听起来像是使用C#扩展方法的好人选,幸运的是NFluent supports extension methods

该思想的要点是,您可以实现一个包含您要具有的逻辑的方法,并且NFluent可以直接调用此方法,以实现 closer 找到您想要的东西(如果不是您要找的东西)。实现这种方法之后,您将可以像这样进行呼叫:

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

扩展方法的原型如下:

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

请注意,您可能可以获取所需的 exact 语法,但是您需要做更多的工作才能弄清楚如何在上下文中执行此操作扩展方法。

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

找到有关如何实现NFluent扩展方法here的示例。

答案 1 :(得分:0)

对于期望值,您可以使用匿名类型获得期望的结果。

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

通过这种方式,您可以集中精力比较感兴趣的领域。

如果您需要进行许多此类检查,则应考虑为此创建一个简单的专用类型,而不是匿名类型。