Який ідіоматичний спосіб перевірити розмір колекції в xUnit?


112

У своєму тестовому наборі є тест, який виглядає приблизно так:

[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)замість цього. Останнє просто хакі, і колишній відчуває, що якщо xUnit, наприклад, намагається уникати декількох повторень IEnumerable<T>, то це неправильний шлях (тому що я отримаю підказки компілятора про це окремо, якщо це проблема), і xUnit самому ніколи не слід оцінювати вхід більше одного разу (адже він, ймовірно, отримає той самий вхід незалежно від змінної вилучення, через те, як працює функція виклику C #).

Отже, я не просто зацікавлений у тому, щоб зняти це попередження зі свого результату. Відповідь на моє запитання також пояснює, чому це попередження в першу чергу включено до бібліотеки, і чому будь-який підхід я повинен використовувати замість цього, краще.


якщо ви зберігаєте stuffCollection.Count()в окремій змінній і передаєте її до атрибуту, чи дає вам таку саму помилку?
hellyale

Може, цей ?
Uwe Keim

Відповіді:


112

Xunit пропонує швидкі виправлення більшості своїх попереджень, тому ви повинні мати можливість бачити, що він вважає "правильним".

xunit

У вашому випадку він хоче використовувати Assert.Singleвас, оскільки ви очікуєте саме одного предмета. Якби ви стверджували довільне число, наприклад 412, воно не попередить вас про використання Count. Він запропонує використовувати лише Singleякщо ви очікуєте один предмет або Emptyякщо ви не очікуєте жодного товару.


6
Дякую, це має сенс. FWIW, я бачив це під час побудови коду VS, де швидкі дії не виявлялися, тому насправді включення пропозиції щодо виправлення у попереджувальне повідомлення було б набагато корисніше.
Томаш Ашан

2
@TomasLycken - ах. Так, для цього є проблема: github.com/xunit/xunit/isissue/1423
vcsjones

5
Я не прихильник такої поведінки; Іноді кількість рахунків 1 є випадковою, і видається менш виразним примусити виклик до .Single (). Тест може змінитись, щоб очікувати різного підрахунку, і здається, що дратувати доведеться зміни, щоб викликати зовсім інший метод, а не просто змінювати число.
варгонська

2
Одномісний класний для одного предмета, у мене є 3 елементи, і я не хочу писати повний Assert.Collection, чи має xUnit Assert.Triple? ха-ха
Pawel Cioch

1
@PawelCioch згідно з xunit.net/xunit.analyzers/rules/xUnit2013.html у них є Empty, Singleі NotEmpty- якщо ви очікуєте, що динамічне значення xUnit2013 не повинно спрацьовувати.
mbx

2

Я виявив, що це дає мені таку ж помилку:

Assert.Equal(2, vm.Errors.Count());

І кастинг зупинив появу помилки.

Assert.Equal(2, (int)vm.Errors.Count());

2
Я абсолютно впевнений, що це НЕ ideomatic шлях.
mbx

1

Для одного елемента в списку краще використовувати його замість цього: Assert.Single(resultList);


-1

У мене була така ж проблема, коли я використовував властивість Count, як показано нижче в xUnit.

введіть тут опис зображення

Після того, як я використовую функцію Count () для колекції, вона виправила мою проблему.


Виправлена ​​проблема, але ви все одно не використовуєте XUnit так, як слід!
Даніель Айзенрайх,

8
@DanielEisenreich - це правильний спосіб стверджувати кількість для певного числа, якщо воно більше 1?
SomeGuyOnAComputer

@SomeGuyOnAComputer та інші 4 оновлення. Забудьте, що я сказав, я був занадто нахабний. Якщо він більший, у вас немає іншого вибору.
Даніель Айзенрайх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.