Assert.That срещу Assert.True

Какво да предпочетете:

Assert.That(obj.Foo, Is.EqualTo(true))

or

Assert.True(obj.Foo)

За мен и двете твърдения са еквивалентни, така че кое трябва да се предпочете?


person Razer    schedule 18.04.2013    source източник
comment
obj.Foo.Should().BeTrue(); fluentassertions.codeplex.com (няма значение какво използвате, стига да е четимо и да доставя до четете какво се опитахте да постигнете)   -  person Ilya Ivanov    schedule 18.04.2013
comment
twitter.com/jamesiry/status/74127537562857472   -  person Mauricio Scheffer    schedule 20.04.2013
comment
Assert няма този метод, откъде идва това?   -  person usefulBee    schedule 29.01.2016
comment
@usefulBee NUnit   -  person Andrew Palmer    schedule 19.04.2016
comment
Не е намерено archive.codeplex.com/?p=fluentassertions   -  person Kiquenet    schedule 03.06.2021


Отговори (4)


В този конкретен случай няма разлика: ще видите изхода с приблизително същото ниво на детайлност (т.е. той ви казва, че нещо, което се очаква да оцени на true, е оценено на false). Същото важи и за

Assert.IsTrue(obj.Foo);

и

Assert.That(obj.Foo, Is.True);

Вашият екип трябва да избере един стил на твърдения и да се придържа към него през всичките си тестове. Ако вашият екип предпочита стила Assert.That, тогава трябва да използвате Assert.That(obj.Foo, Is.True).

person Sergey Kalinichenko    schedule 18.04.2013
comment
FWIW, нашата компания работи с Assert.That, така че вашите тестове да могат да се четат повече като изречения. Вероятно бихте прочели и двете твърдения като Assert that obj.Foo is true, което е буквално точно как е написано второто твърдение. - person EJay; 13.01.2015

Assert.That се нарича модел, базиран на ограничения. Той е гъвкав, защото методът приема параметър от тип IConstraint. Това означава, че можете да структурирате кода си с по-обща йерархия или структура на извикване, като предавате всеки стар IConstraint. Това означава, че можете да създадете свои собствени персонализирани ограничения

Това е проблем с дизайна. Както всички казват, без значение какво все пак трябва да предоставите прилична обратна връзка за съобщение за грешка.

person radarbob    schedule 18.04.2013
comment
Добро кратко обяснение какво е базиран на ограничения модел на твърдение. - person Alexander Stepaniuk; 18.04.2013
comment
Полезен отговор. Обърнете внимание, въпреки че връзката изглежда неправилно насочена, страницата за Nunit 3 е github. com/nunit/docs/wiki/Custom-Constraints - person Richard Petheram; 15.03.2019

Добре, изпълнихте тестовия си пакет на CI сървър и за съжаление един от тях се провали. Отваряте регистрационните файлове и виждате следващото съобщение

BusinessLogicTests.LoginTests.UserAutoLoginTests failed: expected true but was false

Сега как, за бога, бихте разбрали какво се е случило погрешно с тези тестове, ако цялата информация, която виждате, е, че някъде в AutoLoginTests bool се очаква вярно, но е получено невярно? Сега трябва да отидете до изходния файл на вашите тестови случаи и да видите кое твърдение е неуспешно. Ще видиш

Assert.True(obj.Foo)

Удивително... все още е трудно да се каже какво не е наред, само ако сте разработили този модул преди 1 час. Все още трябва да навлезете по-дълбоко в източниците на тестове и вероятно производствените източници или дори да отстраните грешки в кода си, така че най-накрая да разберете, че сте написали грешно променлива в извикването на функция или сте използвали грешен предикат за филтриране на регистрирани потребители. Така сте блокирали незабавната обратна връзка от тестовете, което е много ценно.

Мисълта ми е, че няма значение колко плавни са вашите твърдения (които също са уместни), а каква информация излагате в случай на неуспешни тестове и колко бързо можете да разберете основната причина за неуспеха, дори ако сте работили дълго време преди с тази функционалност

person Ilya Ivanov    schedule 18.04.2013
comment
Вие сте напълно прав. Това беше само въпросът за стила. Трябва да има правилен изход, ако дадено твърдение не успее лесно да открие грешката. - person Razer; 18.04.2013

Това е малко придирчиво, но IMHO мисля, че в този случай Assert.That е ненужно многословно и следователно може да се разглежда като объркване. С други думи, Assert.True е малко по-чист, по-ясен и по-лесен за четене и следователно за разбиране.

За да станете малко по-придирчиви, бих предложил да използвате Assert.IsTrue API вместо Assert.True, тъй като, отново IMHO, IsTrue "чете" по-добре.

person Paul Sasik    schedule 18.04.2013
comment
Склонен съм да не се съглася, ако четете твърденията отляво надясно, буквално получавате Assert that object Foo is true, което се доближава повече до човешкия език. (което е целта на Hamcrest). Предлагам също да се придържате към Hamcrest или твърденията по подразбиране, без да ги смесвате. - person Pieter De Bie; 14.11.2018