我正在使用XUnit来测试需要空的Enumerable列表的场景。
我注意到在某些情况下:
Assert.Empty(msgs);
失败;但
Assert.False(msgs.Any());
正在过世。这对我来说有点混乱,因为我预计这会测试同样的事情。
我理解这可能是因为预期行为的差异:
和
但是,我不确定区别,因为在我看来基本上测试同样的东西。
有人可以解释在这两种不同类型的断言中测试的差异吗?
以下是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();
}
}
他们似乎使用一种非常类似的方式来检查集合中是否存在项目。我希望每种方法都能得到相同的结果。
如果没有关于如何使用每一个的更多细节,很难说为什么你会得到不同的结果。
当msge不为null并且有一个或多个元素时,msge.Any()返回true,否则返回false,因此当参数为null时,msll为null,Assert.Empty失败。 最诚挚的问候。
这两种方法有所不同:
.Any()是一个extension method,它接受一个IEnumerable - 一个对象一个IEnumerable接口的实现,让代码迭代它进行集合操作,(如.Any()或.Where())
Assert.Empty()似乎不检查对象是否实现IEnumerable,而只检查输入数据是字符串还是数组时对空集的检查。
我的猜测是你传入一个IEnumerable对象,而不是一个数组。
要解决这个问题,你可以像以前一样使用Assert.False(msgs.Any());
,或者使用像Assert.Empty(msgs.ToArray());
这样的东西