【问题标题】:FluentAssertions: how to set breakpoint inside lambdaFluentAssertions:如何在 lambda 中设置断点
【发布时间】:2019-07-28 01:44:05
【问题描述】:

FluentAssertions 是一个很棒的库,但是当 lambda 中的某些代码没有按预期工作并且我无法调试它时,我常常感到非常沮丧。尤其是当 lambda 很复杂时。

payload.Resource.Relations.Removed.Should().NotBeNull()
            .And.HaveCount(2)
            .And.AllBeOfType<ResourceRelation>()
            .And.OnlyContain(rel => 
    rel.RelationType.MatchTo(RelationType.ArtifactLink) && 
    rel.Href.AbsoluteUri.StartsWith(VsTfsSchema.GitPullRequestId));

在这种情况下,我想在OnlyContain(...) lambda 内部设置一个断点并对其进行调试。但这是不可能的 - 断点始终设置在整个语句中。我想原因是 FluentAssertions 中的 lambda 是表达式。

有什么方法可以实现吗?

编辑:将 lambda 提取为局部变量没有帮助。行为是一样的。

System.Linq.Expressions.Expression<Func<ResourceRelation, bool>> predicate = rel =>
            rel.RelationType.MatchTo(RelationType.ArtifactLink) && rel.Href.AbsoluteUri.StartsWith(VsTfsSchema.GitPullRequestId);

payload.Resource.Relations.Removed.Should().NotBeNull()
    .And.HaveCount(2)
    .And.AllBeOfType<ResourceRelation>()
    .And.OnlyContain(predicate);

Edit2:这是一个非常简单且可验证的示例。您不能在num == 1 中设置断点,也不能将其提取为本地函数,也不能在手表上显示。

[Fact]
public void SimpleLambdaTest()
{
    int[] nums = Enumerable.Range(1, 10).ToArray();
    nums.Should().OnlyContain(num => num == 1);
}

【问题讨论】:

  • Debugger.Break?
  • @shahkalpesh:不,您不能在表达式中使用 Debugger.Break。

标签: c# unit-testing fluent-assertions


【解决方案1】:

即使是这样,如果您在断行调试中按 F11,应该会将您带到 lambda 表达式。如果没有,您仍然可以使用Add Watch 或Quick Watch 工具(选择 lambda 表达式 -> 右键单击​​并选择快速观看)

【讨论】:

  • 不,这也不起作用。我可以在调试器中显示谓词,但它也是表达式。另外,如果断点不在 lambda 内,可以显示什么值?这就是我在 Watch 中看到的:+ predicate {rel =&gt; (rel.RelationType.MatchTo("ArtifactLink") AndAlso rel.Href.AbsoluteUri.StartsWith("vstfs:///Git/PullRequestId"))} System.Linq.Expressions.Expression&lt;System.Func&lt;Scia.Cid.AppServer.Tfs.Api.Payloads.ResourceRelation, bool&gt;&gt; {System.Linq.Expressions.Expression1&lt;System.Func&lt;Scia.Cid.AppServer.Tfs.Api.Payloads.ResourceRelation, bool&gt;&gt;}
【解决方案2】:

您可以将表达式主体提取到一个静态函数中,您可以在其中设置断点。

注意EqualsOne不能是本地函数,也不能作为方法组传递。

[Fact]
public void SimpleLambdaTest()
{
    int[] nums = Enumerable.Range(1, 10).ToArray();
    nums.Should().OnlyContain(num => EqualsOne(num));
}

private static bool EqualsOne(int num)
{
    // You can put a break point here
    return num == 1;
}

【讨论】:

  • 谢谢,我被困在“表情之谜”中,错过了这么简单的解决方案!
【解决方案3】:

虽然这与 FluentAssertions 无关,但我经常使用 Jetbrains Rider 这样做。当您尝试设置断点时,它会询问您在哪里要设置它;在整条线上,在单个 lambda 上等等。我已经快两年没有使用 Visual Studio 进行调试了,所以我不知道它是否可以处理。

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 2015-08-20
    • 2019-07-20
    • 2015-12-28
    • 1970-01-01
    • 2012-06-05
    • 2011-01-05
    相关资源
    最近更新 更多