javascript-与nodejs的摩卡断言assert(false)而不是错误的挂起/超时
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-与nodejs的摩卡断言assert(false)而不是错误的挂起/超时,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2916字,纯文字阅读大概需要5分钟。
内容图文
![javascript-与nodejs的摩卡断言assert(false)而不是错误的挂起/超时](/upload/InfoBanner/zyjiaocheng/694/27cf962873214e57ad4b82e038838631.jpg)
我有这种摩卡测试:
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()
)
第一个,按预期给出断言错误,第二个,在此处记录并挂在assert(false)处,因此以后永远不会记录.它与文章是流有关,并且断言在拉回叫中,这是从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)
)
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,但是如果您将诺言纳入其中,那么mocha将无法解决问题,因此该示例将挂起.还可以尝试注释断言false并查看其是否通过.
因此,Louis希望我引起您的注意,请您解释一下问题,并尝试使catch看起来确实丑陋,并希望您找到对此的合理解决方案.
解决方法:
因为这就是您在添加“完成”回调时要执行的操作.
实际执行此测试的方法是,如果断言失败,则调用return done(err),其中err是要报告的任何字符串或错误对象.
首先,当断言失败时,程序将引发异常,并且永远不会到达done(),这就是为什么看不到done被调用的原因.这就是断言应该如何工作的方式,但是由于您处于异步测试中,因此结果是永远不会触发回调,这就是为什么您超时的原因.
其次,正如我的原始回答所说,err是您要从测试中发出的任何错误.它可以是字符串错误消息或完整的Error对象子类.您创建它,然后将其传递给done()以指示测试失败.
在异步测试中构造代码的更好方法是将测试用作简单的布尔值,而不是断言.如果您确实要使用assert,则将其包装在try..catch中.这是几个例子:
if(err) return done(err); // in this case, err is defined as part of the parent callback signature that you have in your code already.
if(result.length < 1) return done('Result was empty!');
最后,如果您真的想断言,则可以:
try{
assert(!err);
}catch(e){
return done(e);
}
我之所以调用return done(err)而不是done(err),是因为它停止了其余代码的执行,这通常是您想要的.
内容总结
以上是互联网集市为您收集整理的javascript-与nodejs的摩卡断言assert(false)而不是错误的挂起/超时全部内容,希望文章能够帮你解决javascript-与nodejs的摩卡断言assert(false)而不是错误的挂起/超时所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。