代码之家  ›  专栏  ›  技术社区  ›  Karel Kral

FluentAssertions:如何在lambda中设置断点

  •  1
  • Karel Kral  · 技术社区  · 6 年前

    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提取为局部变量没有帮助。行为是一样的。

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

    编辑2 num == 1 ,也不能将其提取为本地函数,也不能在监视时显示。

    [Fact]
    public void SimpleLambdaTest()
    {
        int[] nums = Enumerable.Range(1, 10).ToArray();
        nums.Should().OnlyContain(num => num == 1);
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Jonas Nyrup Raymond Chen    6 年前

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

    请注意 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;
    }
    
        2
  •  1
  •   Dennis Doomen    6 年前

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

        3
  •  0
  •   Rahul    6 年前

    Add Watch Quick Watch