У меня есть такой тест мокко:мокко с nodejs утверждают зависание/таймауты для утверждают (ложь) вместо ошибки
describe 'sabah', →
beforeEach →
@sabahStrategy = _.filter(@strats, { name: 'sabah2' })[0]
.strat
it 'article list should be populated', (done) →
@timeout 10000
strat = new @sabahStrategy()
articles = strat.getArticleStream('barlas')
articles.take(2).toArray((result)→
_.each(result, (articleList) →
// I make the assertions here
// assert(false)
assert(articleList.length > 1)
)
done()
)
Проблема заключается в том, когда я assert(false)
, тест не вешает до истечения времени ожидания, а не давать ошибку утверждения, почему?
Edit:
Например, если у меня есть эти два теста
it 'assert false', (done) →
assert(false)
done()
it 'article link stream should be populated', (done) →
@timeout 20000
articles = @sabahStrategy.articleLinkStream('barlas')
articles.pull((err, result)→
console.log('here')
assert(false)
console.log('after')
assert(!err)
assert(result.length > 1);
_.each(result, (articleList) →
assert(articleList.link)
)
done()
)
Первый, дает ошибку утверждение, как ожидается, второй, журналы here
и вешает на assert(false)
так after
никогда не регистрируется. Это как-то связано с articles
, являющимся потоком, и утверждение находится в обратном вызове pull
, это от highland.js API.
Решено Редактировать:
Так, по словам Павла I решена проблема с этим кодом:
it 'article stream should be populated', (done) →
@timeout 30000
articles = @sabahStrategy.articleStream('barlas')
articles.pull((err, result) →
try
# assert false properly throws now.
assert(false)
assert(!err)
assert(result.length == 1)
assert(result[0].body)
assert(result[0].title || result[0].title2)
done()
catch e
done(e)
)
Edit2:
Я произвел упрощенную версию проблемы :
h = require('highland')
Q = require('q')
describe 'testasynchigh', →
beforeEach →
@deferred = Q.defer()
setTimeout((→
@deferred.resolve(1)
).bind(this), 50)
it 'should throw', (done) →
s = h(@deferred.promise);
s.pull((err, result) →
console.log result
assert false
done()
)
Я вижу, что ваша версия действительно работает @Louis, но если вы используете обещания в миксе, мокко не может справиться с этой проблемой, поэтому он будет висеть в этом примере. Также попробуйте прокомментировать assert false
и посмотреть, как он проходит.
Итак, Луис Надеюсь, я привлек ваше внимание, не могли бы вы объяснить проблему, и try catch
выглядит уродливым, и я надеюсь, что вы найдете разумное решение этого.
Я написал Мокко код более двух лет тоже, и * * Как правило, вам не нужно ломать исключения, как вы показываете в своем ответе здесь. ** Очень может быть, что 'highland.js' является глотательным исключением или что он имеет некоторую особенность в отношении того, как он обрабатывает исключения в своих обратных вызовах. Но, как правило, Mocha вполне способен обнаруживать исключения, будь то синхронные или асинхронные. Просто запустите 'it (« test », function (done) {setTimeout (function() {throw new Error();}, 100);});' ('done' не вызывается, и это не ошибка.)' Mocha обнаружит исключение без каких-либо проблем. – Louis
@ Louis, вы имеете в виду проглатывание, как описано здесь https://github.com/caolan/highland/issues/121, как вы думаете, это может быть проблемой? – user3995789
@ user3995789 Да, я думаю, это проблема. Я пробовал ваш последний фрагмент с помощью RSVP (другая библиотека обещаний) и получаю те же результаты, что и с Q. Я также пытался использовать «.errors» Хайленда («звонок, но я ничего не получил». – Louis