FluentAssertions:如何在 lambda 中设置断点

FluentAssertions: how to set breakpoint inside lambda

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

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

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

注意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;
}

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