如何使用流利的断言报告对象的名称

Posted

技术标签:

【中文标题】如何使用流利的断言报告对象的名称【英文标题】:How can I report on the name of an object with fluent assertions 【发布时间】:2016-05-12 15:09:52 【问题描述】:

我有一个测试可以检查我们网站上表格中的多个对象。测试用 SpecFlow 和 C# 编写

看起来像这样:

When I click proceed
Then I should see the following values
     | key       | value     |
     | tax       | 5.00      |
     | delivery  | 5.00      |
     | subtotal  | 20.00     |

“然后”步骤的代码类似于:

[StepDefinition("I should see the following values")]
public void IShouldSeeTheFollowingValues(Table table)

    var basketSummary = new BasketModel();

    foreach (var row in table.Rows)
    
        switch (row["key"])
        
            case "tax":
                basketSummary.Tax.Should().Be(row["value"]);
                break;
            case "delivery":
                basketSummary.Delivery.Should().Be(row["value"]);
                break;
            case "subtotal":
                basketSummary.Subtotal.Should().Be(row["value"]);
                break;
        
    

问题在于我们的构建日志中,如果测试错误看起来像这样:

When I click proceed
-> done: OrderConfirmationPageSteps.ClickProceed() (1.0s)
Then I should see the following values
  --- table step argument ---
     | key       | value     |
     | tax       | 5.00      |
     | delivery  | 5.00      |
     | subtotal  | 20.00     |
-> error: Expected value to be 5.00, but found 1.00.

正如您在上面看到的那样,很难区分它意味着哪个对象......当它说它期望它是 5.00 有没有办法可以修改输出以说出以下内容:

-> error: Expected value of Tax to be 5.00, but found 1.00.

【问题讨论】:

【参考方案1】:

你可以做两件事:

    将原因短语传递给 Be() 方法,例如 `basketSummary.Delivery.Should().Be(row["value"], "因为那是 税值”); 将调用包装在AssertionScope 中,并将描述(上下文)传递给它的构造函数,例如 this

【讨论】:

【参考方案2】:

在最新版本https://fluentassertions.com/introduction#subject-identification

string username = "dennis";
username.Should().Be("jonas");
//will throw a test framework-specific exception with the following message:

Expected username to be "jonas" with a length of 5,
 but "dennis" has a length of 6, differs near "den" (index 0).

Fluent Assertions 可以使用单元测试的 C# 代码来提取 主题的名称并在断言失败中使用它。

由于它需要调试符号,这将要求您 以调试模式编译单元测试,甚至在您的构建服务器上。

【讨论】:

以上是关于如何使用流利的断言报告对象的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用流利的断言比较列表?

如何使用流利的断言结合集合和属性断言?

如何使用流利断言断言集合中的所有项目?

流利的断言 - 如何在类型检查后正确链接

流利的断言;结合集合和对象图比较断言

流利的断言:XElement .Should().HaveValueContaining?