gpt4 book ai didi

javascript - mocha with nodejs assert 挂起/超时为 assert(false) 而不是错误

转载 作者:数据小太阳 更新时间:2023-10-29 04:36:53 24 4
gpt4 key购买 nike

我有这种 Mocha 测试:

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)处,所以之后 从不记录。它与 articles 是一个流有关,断言在 pull 回调中,这来自 highland.js API .

已解决的编辑:

所以根据 Paul 的说法,我用这段代码解决了这个问题:

    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,但如果你将 promises 混入其中,mocha 无法处理这个问题,所以它会在这个例子中挂起。还可以尝试注释掉 assert false 并查看它是否通过。

Louis 我希望我能引起你的注意,你能解释一下这个问题吗,try catch 看起来确实很难看,我希望你能找到一个合理的解决方案。

最佳答案

因为当您添加“完成”回调时,这就是您告诉它您想要执行的操作。

实际执行此测试的方法是,如果断言失败,则调用 return done(err),其中 err 是您想要报告的任何字符串或错误对象。

首先,当您的断言失败时,程序会抛出异常并且永远不会到达 done(),这就是为什么您没有看到 done 被调用的原因。这就是断言应该如何工作,但是由于您正在进行异步测试,结果是回调永远不会触发,这就是您超时的原因。

其次,正如我最初的回答所说,err 是您希望从测试中发出的任何错误。它可以是字符串错误消息或完整的错误对象子类。您创建它然后将其传递给 done() 以指示测试失败。

在异步测试中构建代码的更好方法是将测试用作简单的 bool 值,而不是断言。如果你真的想使用断言,那么将它包装在 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 - mocha with nodejs assert 挂起/超时为 assert(false) 而不是错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26770345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com