Assert.Empty(msgs)和Assert.False(msgs.Any())有什么区别?

问题描述 投票:0回答:3

我正在使用XUnit来测试需要空的Enumerable列表的场景。

我注意到在某些情况下:

  • Assert.Empty(msgs);失败;

  • Assert.False(msgs.Any());正在过世。

这对我来说有点混乱,因为我预计这会测试同样的事情。

我理解这可能是因为预期行为的差异:

  1. Enumerable.Any()(将其定义为“确定序列是否包含任何元素。”)

  1. XUnit.Empty()中预期的空(定义这是测试空对象)。

但是,我不确定区别,因为在我看来基本上测试同样的东西。

有人可以解释在这两种不同类型的断言中测试的差异吗?

c# xunit enumerable
3个回答
1
投票

以下是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;
}

以下是xUnit中Assert.Empty的来源:

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
投票

当msge不为null并且有一个或多个元素时,msge.Any()返回true,否则返回false,因此当参数为null时,msll为null,Assert.Empty失败。 最诚挚的问候。


-1
投票

这两种方法有所不同:

.Any()是一个extension method,它接受一个IEnumerable - 一个对象一个IEnumerable接口的实现,让代码迭代它进行集合操作,(如.Any()或.Where())

Assert.Empty()似乎不检查对象是否实现IEnumerable,而只检查输入数据是字符串还是数组时对空集的检查。

我的猜测是你传入一个IEnumerable对象,而不是一个数组。

要解决这个问题,你可以像以前一样使用Assert.False(msgs.Any());,或者使用像Assert.Empty(msgs.ToArray());这样的东西

© www.soinside.com 2019 - 2024. All rights reserved.