В чем разница между утверждением, ожиданием и необходимостью в Чай?

В чем разница между assert, expect и should, а когда использовать что?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');

Ответ 1

Различия описаны там.

Три интерфейса представляют разные стили выполнения утверждений. В конечном счете, они выполняют ту же задачу. Некоторые пользователи предпочитают один стиль над другим. Это, как говорится, есть также несколько технических соображений, которые стоит выделить:

  • Интерфейсы assert и expect не изменяют Object.prototype, а должны делать. Таким образом, они являются лучшим выбором в среде, где вы не можете или не хотите изменять Object.prototype.

  • Интерфейсы assert и expect поддерживают пользовательские сообщения практически везде. Например:

    assert.isTrue(foo, "foo should be true");
    expect(foo, "foo should be true").to.be.true;
    

    Сообщение "foo должно быть истинно" будет выводиться вместе с неудавшимся утверждением, если утверждение не выполняется. У вас нет возможности установить настраиваемое сообщение с интерфейсом if.

(Историческая заметка: в течение долгого времени этот ответ заявил, что для получения пользовательского сообщения с expect вам придется использовать обходной путь. Aurélien Ribon сообщила мне, что передача сообщения в expect в качестве второго параметра работает. Следовательно, нет необходимости в обходном пути. Мне не удалось найти, какая версия Mocha начала предоставлять поддержку этому сообщению, и мне не удалось чтобы найти, какая версия документации задокументировала его в первый раз.)

Обратите внимание, что assert.isTrue(foo), expect(foo).to.be.true и foo.should.be.true выводят следующее, если вы не используете настраиваемое сообщение, и foo === 1:

    AssertionError: expected 1 to be true

Итак, в то время как интерфейс expect и should лучше читать, это не похоже на то, что один интерфейс более естественно информативен, чем другой, когда утверждение терпит неудачу. Это сообщение, которое идентично для всех трех интерфейсов, не говорит вам, что именно вы тестировали, только то, что вы получили 1, но вы хотели true. Если вы хотите узнать, что вы тестировали, вам нужно добавить сообщение.