Ответ 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));