FluentAssertions: как установить точку останова внутри лямбды - PullRequest
1 голос
/ 06 марта 2019

FluentAssertions - отличная библиотека, но часто я очень расстраиваюсь, когда какой-то код в 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(...) лямбды и отладить ее.Но это невозможно - точка останова устанавливается всегда на весь оператор.Я предполагаю, что причина в том, что лямбды в FluentAssertions являются выражениями.

Есть ли способ, как этого добиться?

Редактировать : извлечение лямбды как локальной переменной не помогает.Поведение такое же.

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

Ответы [ 3 ]

2 голосов
/ 06 марта 2019

Вы можете извлечь тело выражения в статическую функцию, в которой вы можете установить точку останова.

Обратите внимание, что 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;
}
1 голос
/ 06 марта 2019

Хотя это не имеет ничего общего с FluentAssertions, я делаю это довольно часто с Jetbrains Rider. Когда вы пытаетесь установить точку останова, она спросит вас , где вы хотите ее получить; по всей линии, по отдельной лямбде и т. д. Я не отлаживал Visual Studio уже почти два года, поэтому не знаю, справится ли она.

0 голосов
/ 06 марта 2019

Даже если это так, если вы нажмете F11 в ломаной строке, отладка приведет вас к лямбда-выражению. Если нет, вы все равно можете использовать средство Add Watch или Quick Watch (выберите лямбда-выражение -> щелкните правой кнопкой мыши и выберите Quick Watch)

...