В моем наборе тестов есть тест, который выглядит примерно так:
[Fact]
public void VerifySomeStuff()
{
var stuffCollection = GetSomeStuff();
Assert.Equal(1, stuffCollection.Count());
}
Этот тест работает так, как я ожидал, но когда я его запускаю, xUnit выводит предупреждение:
предупреждение xUnit2013: не используйте Assert.Equal () для проверки размера коллекции.
Однако в предупреждении не предлагается никакой альтернативы, и поиск в Google приводит меня к исходному коду в xUnit для теста, который проверяет, напечатано это предупреждение.
Если Assert.Equal()
это неправильный способ проверить длину коллекции, то какой?
Чтобы уточнить: я понимаю, что могу «обмануть» xUnit, чтобы он не выдавал это предупреждение, например, извлекая переменную или используя Assert.True(stuff.Count() == 1)
вместо нее. Последнее просто Hacky, и бывший чувствует , как если XUnit является , например , пытаясь избежать многократных итераций цикла IEnumerable<T>
, то это неправильный путь (потому что я буду получить подсказки компилятора о том , что по отдельности , если это проблема), и XUnit сам по себе никогда не должен оценивать ввод более одного раза (на самом деле он, вероятно, получит тот же ввод независимо от извлечения переменной из-за того, как работает вызов функций C #).
Итак, я не просто хочу удалить это предупреждение из моих выходных данных. Ответ на мой вопрос также объясняет, почему это предупреждение включено в библиотеку в первую очередь и почему любой подход, который я должен использовать вместо этого, лучше.
stuffCollection.Count()
в отдельной переменной и передаете ее в assert, выдает ли она ту же ошибку?Ответы:
Xunit предлагает быстрые исправления для большинства своих предупреждений, поэтому вы должны быть в состоянии увидеть, что он считает «правильным».
В вашем случае он хочет, чтобы вы использовали,
Assert.Single
так как вы ожидаете ровно один предмет. Если бы вы указали произвольное число, например 412, он не выдал бы вам предупреждения об использованииCount
. Он будет предлагать использовать только в томSingle
случае, если вы ожидаете один предмет илиEmpty
если вы не ожидаете никаких предметов.источник
Empty
,Single
иNotEmpty
- если вы ожидаете, что динамическое значение xUnit2013 не должно срабатывать.Я обнаружил, что это дает мне ту же ошибку:
И его кастинг остановил появление ошибки.
источник
Для одного элемента в списке лучше использовать это:
Assert.Single(resultList);
источник
У меня была такая же проблема, когда я использовал свойство Count, как показано ниже в xUnit.
После этого я использую функцию Count () для сбора, она устранила мою проблему.
источник