Mocha/Chai async tests 'done()' fn не работает

Я тестирую модель банка, которую я имею:

describe('Bank Model - Ajax', function () {

    it('loads bank', function (done) {

        var bank = new Bank();

        bank.OnLoaded = _(function () {
            expect(this.id).to.eql(1171);
            expect(true).to.eql(false);
            done();
        }).bind(bank);

        bank.load(1171);


    });
});

Вызов загрузки делает запрос ajax для моего сервера. Моя проблема в том, что expect(true).to.eql(false); выбрасывает Uncaught Assertion Error, и я не уверен, почему. Я использую рекомендованную стратегию Mocha для завершения моего тестового примера. Я делаю это неправильно?

Спасибо.

Ответ 1

Ты не делаешь ничего плохого. Mocha нелегко перехватывает исключения, которые бросаются в обратный вызов, поскольку они выполняются после завершения тестовой функции, поэтому любые неудачные утверждения - это неотображаемые фатальные ошибки, а не хорошие различия, которые вы обычно получаете с синхронным кодом.

Люди работают над обходными решениями, такими как предоставляя настраиваемый метод, который могут использовать вызовы, вместо того, чтобы метать, или используя Node Домены при работе в Node. Но пока кажется, что он по-прежнему не ведет себя идеально.

Так как метод done принимает единственный параметр, содержащий ошибку, вы можете добавить код в свой тест, чтобы перехватывать исключения в обратном вызове и передавать их в done(err) внутри блока catch. Но это будет довольно грязно.

Может уменьшить повторение с помощью некоторой вспомогательной функции, как показано ниже:

function catching(done, fn) {
  try {
    fn();
    done();
  } catch(err) {
    done(err);
  }
}

И затем:

bank.OnLoaded = catching(done, _(function () {
  expect(this.id).to.eql(1171);
  expect(true).to.eql(false);
}).bind(bank));