2013-05-03 5 views
3

Как работают асинхронные тесты в инфраструктуре тестирования для интерьеров? Я попытался заставить их работать точно так же, как в примере, но асинхронный тест проходит немедленно, не дожидаясь запуска обратного вызова.Как работают асинхронные тесты в стажере?

it('should connect in 5 seconds', function() { 
    var dfd = this.async(5000); 
    conn.connect(credentials, dfd.callback(function(result) { 
     expect(result).to.... something 
    })); 
} 

Тест проходит немедленно. Что я делаю не так?

+0

Возможно, тест проходит, потому что обратный вызов _is_ называется ожидаемым, и утверждение в вашем обратном вызове проходит? Я предполагаю, что вы подтвердили, что callback еще не вызван. Просто мысль. – bitpshr

+0

Ну, 'conn.connect' должен выполнять асинхронный запрос, но обратный вызов запускается до того, как произойдет любое XMLHttpRequest. –

+0

Ну, я выяснил, что обратный вызов запускается еще до установления соединения. Однако переменная 'result' содержит статус, и мне нужно проверить его только тогда, когда состояние равно определенному значению. Могу ли я сказать что-то вроде «это не мой случай, снова вызовите обратный вызов, когда вы нажмете другой результат»? –

ответ

5

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 кроме него автоматически не разрешить обещание; вы делаете это сами в конце.

+0

Спасибо за ваш ответ! Посмотрите на мой комментарий выше - я описываю проблему там. –

1

Ваша структура в порядке. dfd устанавливает тайм-аут в течение 5 секунд, чтобы тест прошел успешно, а затем сразу же пытается выполнить conn.connect(), который не является частью рамки intern. Если вы попробуете простой запрос XHR, попробуйте вместо этого функцию getUrlCallback.

У них есть довольно классный список тестов по этому адресу: https://github.com/theintern/intern/wiki/Writing-Tests. Посмотрите на два примера асинхронного программирования.

Смежные вопросы