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 Watch
或 Quick 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 进行调试了,所以我不知道它是否可以处理。
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 Watch
或 Quick 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 进行调试了,所以我不知道它是否可以处理。