dfd.callback
ничего не выполняет, пока он сам не будет выполнен. Имейте в виду, что он предназначен для надежных обратных вызовов (т. Е. Функция передана promise.then
), а не обратные вызовы типа Node.js, где аргумент может быть ошибкой (то есть function (error, result) {}
). Он не проверяет, принимается ли ошибка в качестве аргумента.
Не зная, что conn
есть, но, видя, как вы передаете dfd.callback
в качестве аргумента то, что это не обещание, мои подозрения вы пытаетесь использовать функцию обратного вызова Node.js стиле и вызов немедленно erroring. Мы можем обеспечить удобство оболочки для этих типов обратных вызовов в будущем, чтобы преобразовать их в интерфейс обещание, но до тех пор, вы, вероятно, просто нужно сделать что-то вроде этого:
it('should connect in 5 seconds', function() {
var dfd = this.async(5000);
conn.connect(credentials, dfd.callback(function(error, result) {
if (error) {
throw error;
}
expect(result).to.... something
}));
});
В противном случае, не зная, что conn
является и, видя, каково ваше фактическое утверждение, слишком сложно сказать, в чем проблема. Если ничто внутри обратного вызова не вызывает ошибку, тест будет считаться успешным.
Редактировать: Таким образом, исходя из ваших комментариев выше, это звучит так, как ваш обратный вызов - это прослушиватель событий, вызываемый несколько раз с разной информацией. В этом случае, что вы могли бы сделать что-то вроде этого:
it('should connect in 5 seconds', function() {
var dfd = this.async(5000);
conn.connect(credentials, dfd.rejectOnError(function (result) {
if (result !== 'what I want') {
return;
}
expect(result).to.... something
// all other tests…
// nothing threw an error, so it is a successful test
dfd.resolve();
}));
});
dfd.rejectOnError
работает так же, как dfd.callback
кроме него автоматически не разрешить обещание; вы делаете это сами в конце.
Возможно, тест проходит, потому что обратный вызов _is_ называется ожидаемым, и утверждение в вашем обратном вызове проходит? Я предполагаю, что вы подтвердили, что callback еще не вызван. Просто мысль. – bitpshr
Ну, 'conn.connect' должен выполнять асинхронный запрос, но обратный вызов запускается до того, как произойдет любое XMLHttpRequest. –
Ну, я выяснил, что обратный вызов запускается еще до установления соединения. Однако переменная 'result' содержит статус, и мне нужно проверить его только тогда, когда состояние равно определенному значению. Могу ли я сказать что-то вроде «это не мой случай, снова вызовите обратный вызов, когда вы нажмете другой результат»? –