我有这种摩卡测试:
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)
时,测试都会挂起直到超时,而不是给出断言错误,为什么?
编辑:
例如,如果我有这两个测试
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()
)
第一个,如预期的那样给出断言错误,第二个,logs here
,并且挂起,assert(false)
所以after
永远不会记录。它与articles
作为流有关,并且断言在pull
回调中,这来自highland.js API。
解决编辑:
所以根据保罗的说法,我用这段代码解决了这个问题:
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)
)
编辑2:
我已经制作了问题的简化版本:
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,但如果你将承诺加入混合中,mocha 无法解决问题,所以它会在这个例子中挂起。还可以尝试注释掉assert false
并查看它是否通过。
所以路易斯,我希望我能引起你的注意,你能解释一下这个问题吗,try catch
看起来确实很丑,我希望你能找到一个合理的解决方案。