В чем разница между Assert.Empty (msgs) и Assert.False (msgs.Any ())? - PullRequest
0 голосов
/ 18 апреля 2019

Я использую XUnit для тестирования сценариев, где ожидается пустой список Enumerable.

Я заметил, что в определенных сценариях:

  • Assert.Empty(msgs); не удалось;

НО

  • Assert.False(msgs.Any()); проходит.

Это немного смущает меня, так как я ожидал, что это проверяет на то же самое.

Я понимаю, что это вероятно из-за различий в ожидаемом поведении между:

  1. Enumerable.Any () (который определяет это как "Определяет, содержит ли последовательность какие-либо элементы.")

И

  1. Пустое значение, ожидаемое в XUnit.Empty () (которое определяет, что это тестирование на пустой объект).

Однако я не уверен, в чем именно разница, так как мне показалось, что я по сути проверял одно и то же.

Может, кто-нибудь объяснит различия в том, что проверяется в этих двух разных типах утверждений?

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Вот источник Enumerable.Any (Assert.False() только подтверждает, что возвращается false.):

public static bool Any<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    using (IEnumerator<TSource> e = source.GetEnumerator()) {
        if (e.MoveNext()) return true;
    }
    return false;
}

Вот источник Assert.Empty от xUnit:

public static void Empty(IEnumerable collection)
{
    Assert.GuardArgumentNotNull("collection", collection);

    var enumerator = collection.GetEnumerator();
    try
    {
        if (enumerator.MoveNext())
            throw new EmptyException(collection);
    }
    finally
    {
        (enumerator as IDisposable)?.Dispose();
    }
}

Кажется, они используют очень похожий способ проверки наличия предметов в коллекции.Я ожидаю того же результата от каждого метода.

Без подробностей о том, как вы используете каждый из них, трудно сказать, почему вы получаете разные результаты.

0 голосов
/ 18 апреля 2019

msge.Any () возвращает true, если msge не равно нулю и имеет один или несколько элементов, и false в противном случае, поэтому, вероятно, msge равно null и Assert.Empty завершается ошибкой, когда аргумент равен нулю.С наилучшими пожеланиями.

0 голосов
/ 18 апреля 2019

Существует разница между этими двумя методами:

.Any () - это метод расширения , который принимает IEnumerable - объект, реализующий интерфейс IEnumerableчтобы позволить коду перебирать его для операций над множествами (например, .Any () или .Where ())

Assert.Empty () не проверяет, реализует ли объект IEnumerable, а только проверяетпустой набор, если входные данные являются строкой или массивом.

Я предполагаю, что вы передаете объект IEnumerable, а не массив.

Чтобы обойти это,может использовать Assert.False(msgs.Any()); как раньше или использовать что-то вроде Assert.Empty(msgs.ToArray());

...