【发布时间】: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