Я использую framework.hs (v8.2.x) для модульного тестирования и играю с некоторыми очень базовыми тестами. Тем не менее, я столкнулся с этой проблемой, когда тесты не удались, и это меня насторожило.Should.js - Несогласованность в методе equals should.equals
Я определил эту фиктивную функцию, чтобы проверить, add
:
var add = function(a, b) {
if (isNaN(a) || isNaN(b)) {
throw new Error('One of the arguments is not a number');
}
return +a + +b
};
Теперь here're мои фиктивные тесты:
should.equal(add('1', '1'), '2'); // passes
add('1', '1').should.equal('2') // fails!
Теперь в соответствии с их github, should(something)
и something.should
обычно возвращают то же самое , но дополнительной информации о различиях нет.
Согласно их API documentation, should.equal
- это то же самое, что и assert.equal
. Но это испытание проходит для меня:
assert.equal(add('1','1'), '2'); // passes
Поэтому у меня есть три вопроса:
- Почему
add('1', '1').should.equal('2')
не миновать? - Почему два способа использования должны давать разные результаты?
- Почему документы говорят
should.equals
- это то же самое, что иassert.equals
, когда у них действительно другое поведение?
Я предполагаю, что один использует '==', а другой использует '==='. Функция 'add' возвращает' Number', который вы сравниваете с 'string'. Возможно, тип принуждения, который делается, отличается? Что произойдет, если вы выполните 'add ('1', '1'). Should.equal (2)' вместо этого? –
Что сказал @ChrisTavares, когда вы занимаетесь тестированием чисел и строк, вам нужно проверить, как выполняется тестирование, я бы предположил, что тест вернет '' 11'' для ''1' + '1'', но ясно это не очень буквально. – brod
@ChrisTavares Да, 'equals' должен использовать' == 'и' 1 == '1'' в javascript. Существует также 'strictEquals', который использует' === '. 'add ('1', '1'). should.equal (2)' does pass. @brod Если вы посмотрите на 'add', я использую унарный оператор' + ', чтобы принудить их к Numbers. = –