Как использовать метод в FluentAssertions - PullRequest
2 голосов
/ 28 мая 2020

Иногда мне приходится утверждать, что два списка содержат одинаковые элементы. С плавными утверждениями это можно сделать следующим образом:

class MyObject { public string MyString {get; set;} }

var o1 = new MyObject { MyString = "1    " }
list1.Add(o1);

var o2 = new MyObject { MyString = "1" }
list2.Add(o2);

list1.Should().BeEquivalentTo(list2)

Но иногда я хочу, чтобы конкретное свойство c сравнивалось другим способом, например:

list1.Should().BeEquivalentTo(list2, options => options
            .Using<string>(context => context.Subject.TrimEnd().Should().Be(context.Expectation))
            .When<string>( ??????? ));

I пробовали:

it => it.SelectedMemberInfo.Name == PropertyNameHere

Но SelectedMemberInfo может быть нулевым, и он выдает исключение, когда null, и я не знаю, правильно ли я его называю.

Обновление 1: Пробовал, но исключение нулевой ссылки:

        options => options
        .Using<DateTime>(it => it.Subject.Should().BeCloseTo(DateTime.Now, TimeSpan.FromMinutes(1)))
        .When(it =>
            it != null
            && it.SelectedMemberInfo != null
            && it.SelectedMemberInfo.Name == nameof(Y.X)));

Ответы [ 2 ]

1 голос
/ 09 июня 2020

Для сопоставления со свойством MyString наиболее часто используются два способа сопоставления либо по типу, либо по пути.

Чтобы соответствовать MyString по типу, вы используете WhenTypeIs<string>.

[TestMethod]
public void MatchByType()
{
    var o1 = new MyObject { MyString = "1    " };
    var list1 = new[] { o1 };

    var o2 = new MyObject { MyString = "1" };
    var list2 = new[] { o2 };

    list1.Should().BeEquivalentTo(list2, opt => opt
        .Using<string>(ctx => ctx.Subject.TrimEnd().Should().Be(ctx.Expectation))
        .WhenTypeIs<string>());
}

Для любопытных WhenTypeIs<TMemberType> - это просто псевдоним для

When(info => info.RuntimeType.IsSameOrInherits(typeof(TMemberType))

To сопоставьте MyString по его имени, вы можете использовать When(e => e.SelectedMemberPath).

SelectedMemberPath определяется как

полный путь от объекта root до разделения текущего объекта точками.

В этом случае объект root равен MyObject, поэтому SelectedMemberPath будет "MyString". Это можно записать как:

[TestMethod]
public void MatchByName()
{
    var o1 = new MyObject { MyString = "1    " };
    var list1 = new[] { o1 };

    var o2 = new MyObject { MyString = "1" };
    var list2 = new[] { o2 };

    list1.Should().BeEquivalentTo(list2, opt => opt
        .Using<string>(ctx => ctx.Subject.TrimEnd().Should().Be(ctx.Expectation))
        .When(e => e.SelectedMemberPath.EndsWith(nameof(MyObject.MyString))));
}
0 голосов
/ 28 мая 2020

Проблема здесь в том, что вы пытаетесь получить доступ к члену в объекте, который не был создан. Поскольку it.SelectedMemberInfo равно null, доступ к Name отсутствует. В документации. NET по NullReferenceException есть хорошее объяснение этого.

https://docs.microsoft.com/en-us/dotnet/api/system.nullreferenceexception?view=netcore-3.1

Предполагая, что нет других особых обстоятельств, когда SelectedMemberInfo null, вам просто нужно сделать выражение в .When() нулевым. Вы можете сделать это довольно легко с помощью одного символа (нулевое распространение):

it => it.SelectedMemberInfo?.Name == PropertyNameHere

Нулевое распространение работает следующим образом: если объект перед вопросительным знаком имеет значение NULL, он будет оцениваться как нулевой экземпляр введите в конце утверждения. Итак, в этом случае, если it.SelectedMemberInfo имеет значение null, это будет оцениваться как (string) null.

Если вам нравятся дополнительные строки, вы также можете сделать это -

it => it.SelectedMemberInfo != null && it.SelectedMemberInfo.Name == PropertyNameHere)

Если есть вероятность того, что у вас могут быть нулевые элементы в родительской коллекции, вам также понадобится проверка на ноль -

it => it?.SelectedMemberInfo?.Name == PropertyNameHere
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...