2016-03-06 6 views
0

Я использую 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 

Поэтому у меня есть три вопроса:

  1. Почему add('1', '1').should.equal('2') не миновать?
  2. Почему два способа использования должны давать разные результаты?
  3. Почему документы говорят should.equals - это то же самое, что и assert.equals, когда у них действительно другое поведение?
+1

Я предполагаю, что один использует '==', а другой использует '==='. Функция 'add' возвращает' Number', который вы сравниваете с 'string'. Возможно, тип принуждения, который делается, отличается? Что произойдет, если вы выполните 'add ('1', '1'). Should.equal (2)' вместо этого? –

+0

Что сказал @ChrisTavares, когда вы занимаетесь тестированием чисел и строк, вам нужно проверить, как выполняется тестирование, я бы предположил, что тест вернет '' 11'' для ''1' + '1'', но ясно это не очень буквально. – brod

+0

@ChrisTavares Да, 'equals' должен использовать' == 'и' 1 == '1'' в javascript. Существует также 'strictEquals', который использует' === '. 'add ('1', '1'). should.equal (2)' does pass. @brod Если вы посмотрите на 'add', я использую унарный оператор' + ', чтобы принудить их к Numbers. = –

ответ

0

Ответы на ваши вопросы и то, что вы получили не так.

Теперь, согласно их github, должно (что-то) и что-то. Как правило, возвращать то же самое, но дополнительной информации о различиях нет.

should(something) и something.should да обычно одинаково. Но вы использовали should.equal, docs ничего не говорит о его равноправии к другим методам. Это просто copy of node.js собственный assert.equal

Почему добавить ('1', '1'). Should.equal ('2') не проходят?

Потому что документы ясно сказали, что он использует === внутренне.

Почему два способа использования должны давать разные результаты?

Потому что это разные методы, и нигде не сказано, что он должен быть равным.

Почему в документах указано, что .equals - это то же самое, что и assert.equals, когда у них действительно другое поведение?

$ node 
> var should = require('.') 
undefined 
> var assert = require('assert') 
undefined 
> var add = function(a, b) { 
... if (isNaN(a) || isNaN(b)) { 
.....  throw new Error('One of the arguments is not a number'); 
..... } 
... return +a + +b 
... }; 
undefined 
> should.equal(add('1', '1'), '2'); 
undefined 
> assert.equal(add('1', '1'), '2'); 
undefined 

Так, чтобы попытаться ясно, что вы ошибались: в should.js существует should.equal(a, b), который является таким же, как assert.equal.Также существует something.should.equal(other), который использует === внутренне (потому что существует .eql, который делает глубокую проверку), также should(somethng).equal(other) - это то же самое, что и something.should.equal(other) (но не для стандартных оберток).

Надеюсь, это прояснит ситуацию.

Смежные вопросы