В чем разница expect(something).toBe(true)
, expect(something).toBeTruthy()
и expect(something).toBeTrue()
?
Обратите внимание, что toBeTrue()
это пользовательское сопоставление, представленное jasmine-matchers
среди других полезных и удобных сопоставителей, таких как toHaveMethod()
или toBeArrayOfStrings()
.
Вопрос должен быть общим, но, как пример из реальной жизни, я проверяю, отображается ли элемент protractor
. Какой совпадатель я должен использовать в этом случае?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
.toBe(true)
==.toBeTrue()
. toBeTruthy () может быть истинным не только по истине , но по 123 , "dfgdfg", [1,2,3] и т. д ... в основномif(x==true)
верны, в то времяif(x===true)
как верны истины.toBeTruthy
если вы не уверены в типе, он такой же, как в== true
то время, как я подозреваю.toBe(true)
, тот же, что и=== true
Mind you, немного за борт, чтобы вызвать функцию для проверки на true. Слово совета. Забудьте==
и!=
существует в Javascript и никогда не используйте его снова. Правда не нужна и ловушка для начинающих. Используйте===
и!==
вместо.eslint
сообщаем нам, если==
или!=
используем, предлагая изменить его на===
и!==
.Ответы:
Что я делаю, когда мне интересно что-то вроде заданного здесь вопроса, так это перейти к источнику.
быть()
expect().toBe()
определяется как:Он выполняет свой тест,
===
что означает, что при использовании в качествеexpect(foo).toBe(true)
он пройдет, только если наfoo
самом деле имеет значениеtrue
. Истинные значения не пройдут тест.toBeTruthy ()
expect().toBeTruthy()
определяется как:Тип принуждения
Значение является истинным, если приведение этого значения к логическому значению приводит к получению значения
true
. Операция!!
проверяет правдивость путем приведения значения, переданногоexpect
логическому значению . Обратите внимание, что вопреки тому, что подразумевает принятый в настоящее время ответ ,== true
это не правильный тест на правдивость. Вы получите смешные вещи, такие какПринимая во внимание, что используя
!!
выходы:(Да, пустой или нет, массив правдив.)
toBeTrue ()
expect().toBeTrue()
является частью Jasmine-Matchers (которая зарегистрирована на npm, как иjasmine-expect
более поздний зарегистрированный проектjasmine-matchers
).expect().toBeTrue()
определяется как:Разница с
expect().toBeTrue()
и вexpect().toBe(true)
том, чтоexpect().toBeTrue()
проверяет, имеет ли он дело сBoolean
объектом.expect(new Boolean(true)).toBe(true)
потерпит неудачу, тогда какexpect(new Boolean(true)).toBeTrue()
пройдет. Это из-за этой забавной вещи:По крайней мере, это правда
Какой лучше всего подходит для использования с
elem.isDisplayed()
?В конечном итоге транспортир передает эту просьбу Селену. В документации говорится, что значение, полученное с
.isDisplayed()
помощью обещания, разрешается вboolean
. Я бы взял это по номиналу и использовать.toBeTrue()
или.toBe(true)
. Если бы я нашел случай, когда реализация возвращает значения «истина / ложь», я бы отправил отчет об ошибке.источник
В javascript есть истины и истины. Когда что-то верно, это, очевидно, правда или ложь. Когда что-то правдиво, оно может быть или не быть логическим, но значение «cast» является логическим.
Примеры.
Это может упростить задачу, если вы хотите проверить, установлена ли строка или есть ли у массива какие-либо значения.
И как заявлено.
expect(something).toBe(true)
иexpect(something).toBeTrue()
то же самое. Ноexpect(something).toBeTruthy()
это не одно и то же.источник
[] == false;
неверно, само утверждение неверно, потому что объекты всегда правдивы[] == false;
являетсяtrue
[""]==false
или[0]== false
; не пустой, не фальшивый, просто обманчивый ...x == true
как вы используете в своих примерах, вводит в заблуждение и, как показывают приведенные выше комментарии, неверный способ проиллюстрировать концепцию правдивости в JavaScript. Настоящий тест на достоверность в JavaScript - это то, как значение ведет себя вif
выражении или как операнд в логическом выражении. Мы знаем, что1
это правда, потому чтоif (1)
это приведет к оценке следующего утверждения. Точно так[]
же правдива по той же причине: даже если она будет[] == true
оцененаfalse
,if ([])
она все равно вызовет оценку следующего утверждения, поэтому мы знаем, что[]
это правда.Я знаю, что все любят легко читаемый список:
toBe(<value>)
- Возвращаемое значение совпадает с<value>
toBeTrue()
- Проверяет, является ли возвращаемое значениеtrue
toBeTruthy()
- Проверьте, будет ли значение, приведенное к логическому, истинным значениемTruthy значения все значения, которые не являются
0
,''
(пустая строка),false
,null
,NaN
,undefined
или[]
(пустой массив) *.* Обратите внимание, что при запуске
!![]
он возвращаетсяtrue
, но при запуске[] == false
он также возвращаетсяtrue
. Это зависит от того, как это реализовано. Другими словами:(!![]) === ([] == false)
На твоем примере
toBe(true)
иtoBeTrue()
дадут те же результаты.источник
alert(!![])
[] == true
в вашей консоли производитfalse
.[] == false
у тебя консоль выдаетtrue
Есть много хороших ответов, я просто хотел добавить сценарий, в котором использование этих ожиданий может быть полезным. Используя
element.all(xxx)
, если мне нужно проверить, отображаются ли все элементы за один прогон, я могу выполнить -Причина в том ,
.all()
возвращает массив значений и поэтому все виды ожиданий (getText
,isPresent
и т.д. ...) может быть выполнено с ,toBeTruthy()
когда.all()
приходит в картину. Надеюсь это поможет.источник
reduce()
что - массив логических значений в одном значении и затем применениеtoBe(true)
проверки. Это намного проще, спасибо.