Mocha/Should.js с использованием асинхронной функции

Я новичок в тестовых фреймворках JavaScript. Я хотел бы сделать небольшую оптимизацию, но я столкнулся с некоторыми проблемами. Проект использует should.js

Вот упрощенная версия моих оригинальных тестовых случаев:

describe('Simple', function() {
  describe('Test', function() {
    it('should do something', function(done) {
      somePromise.then(function(data) {
        data.should.above(100);
        done();
      });
    }

    it('should do something else but alike', function(done) {
      somePromise.then(function(data) {
        data.should.above(100);
        done();
      });
    }

  }
});

Я пытаюсь сделать это так:

var testFunc = function(data) {
  it('should do something', function(done) {
      data.should.above(100);
      done();
  });
}

describe('Simple', function() {
  describe('Test', function() {
      somePromise.then(function(data) {
        testFunc(data);
      });

      somePromise.then(function(data) {
        testFunc(data);
      });
  }
});

Обещание асинхронное, и, возможно, именно поэтому моя "оптимизация" не сработала? Я не нашел "готово" обратного вызова для describe функция в документах.

Заранее спасибо! Любая помощь будет признательна!

1 ответ

Решение

Ваш пример не работает, так как Mocha завершил регистрацию тестовых случаев, когда ваше обещание выполнено.

Тестирование одного и того же обещания с разными утверждениями

Чтобы протестировать одно обещание с использованием нескольких утверждений, вам просто нужно создать обещание в начале тестов, а затем использовать его в блоках it, как показано ниже:

describe('A module', function() {
    var promise;

    before(function () {
        promise = createPromise();
    });

    it('should do something', function() {
        return promise.then(function (value) {
            value.should.be.above(100);
        });
    });

    it('should do something else', function() {
        return promise.then(function (value) {
            value.should.be.below(200);
        });
    });
});

Обратите внимание, что если обещание возвращается из вызова API, вызов будет выполнен только один раз. Результат просто кэшируется в обещании для двух тестовых случаев.

Это также использует тот факт, что вы можете возвращать обещания из тестовых случаев вместо использования готового обратного вызова. В этом случае контрольный пример потерпит неудачу, если обещание будет отклонено или произойдет сбой любого из утверждений в вызовах then().

Тестирование разных обещаний с одинаковыми утверждениями

Предполагая, что вы хотите проверить разные обещания, используя одни и те же утверждения, вы можете передать функцию testFunc это создает обещание быть проверенным.

var testFunc = function(promiseFactory) {
  it('should do something', function(done) {
      promiseFactory().then(function(data) {
          data.should.above(100);
          done();
      });
  });
}

describe('Simple', function() {
  describe('Test', function() {
      testFunc(function () { return createSomePromise(); });

      testFunc(function () { return createSomeOtherPromise(); });
  });
});

Это работает со времен мокко it Функция запускается непосредственно внутри блока описания. Обещания затем создаются с использованием promiseFactory обратный вызов, когда тестовые случаи действительно выполняются.

Как вы можете также вернуть обещания из тестовых случаев, вы можете изменить testFunc чтобы вернуть утверждение как обещание:

var testFunc = function(promiseFactory) {
  it('should do something', function() {
      return promiseFactory().should.eventually.be.above(100);
  });
}
Другие вопросы по тегам