Javascript 如何让摩卡通过测试
我有以下测试:Javascript 如何让摩卡通过测试,javascript,node.js,mocha.js,Javascript,Node.js,Mocha.js,我有以下测试: it.only('validation should fail', function(done) { var body = { title: "dffdasfsdfsdafddfsadsa", description: "Postman Description", beginDate: now.add(3, 'd').format(), endDate: now.add(4, 'd').format()
it.only('validation should fail', function(done) {
var body = {
title: "dffdasfsdfsdafddfsadsa",
description: "Postman Description",
beginDate: now.add(3, 'd').format(),
endDate: now.add(4, 'd').format()
}
var rules = eventsValidation.eventCreationRules();
var valMessages = eventsValidation.eventCreationMessages();
indicative
.validateAll(rules, body, valMessages)
.then(function(data) {
console.log("SHOULD NOT GET HERE");
should.fail("should not get here");
done();
})
.catch(function(error) {
console.log("SHOULD GET HERE");
console.log(error);
});
done();
});
测试执行路径是正确的。当我有验证数据时,它会转到“不应该到这里”。测试的目的是确保它不会。当我输入非验证性数据时,代码会转到“应该到这里”。因此验证规则是有效的
我试图做的是确保当我有错误的验证数据时测试失败,并且它验证了。然而,当我使用良好的数据按原样运行时,它会验证、运行失败,但摩卡仍将其标记为通过。如果执行到“不应该到这里”,我希望它失败
我尝试抛出新错误(“失败”);也没有运气。在这两种情况下,它实际上似乎也在.catch块中运行代码
有什么建议吗?
我找到了一个解决办法。写这个问题是因为这些解决方案似乎对我不起作用。使用
chai作为承诺
,使用本地摩卡承诺处理程序
var chai=require('chai')。使用(require('chai-as-associated'));
var should=chai.should();//这将为承诺断言启用.should
您不再需要完成
,只需返回承诺即可
//从下面的行中删除'done'
仅限('validation should fail',函数(/*done*/){
变量体={
标题:“DFFDASFSDFSDFDFSADSA”,
描述:“邮递员描述”,
beginDate:now.add(3,'d').format(),
endDate:now.add(4,'d').format()
}
var rules=eventsValidation.eventCreationRules();
var valMessages=eventsValidation.eventCreationMessages();
//还债
指示性回报
.validateAll(规则、正文、消息)
.should.be.rejected;//只有承诺被拒绝,测试才会通过
//移除完成后,我们不再需要它
//完成();
});
您可以拨打:
此外,如果使用参数调用done()
函数,Mocha认为测试失败
例如:
it("should return empty set of tags", function(done)
{
done(new Error("Some error message here"));
});
虽然第一个对我来说更清楚。在ES2017/world中,不需要像承诺的那样
。虽然简单的拒绝是一个地方,chai承诺的
仍然有点整洁
如果要更详细地测试错误,则需要一个catch
it.only('validation should fail', async function(){
let body = { ... }
let rules = eventsValidation.eventCreationRules()
let valMessages = eventsValidation.eventCreationMessages()
try {
await indicative.validateAll(rules, body, valMessages)
} catch (error) {
expect(error).to.be.instanceOf(Error)
expect(error.message).to.match(/Oh no!/)
return
}
expect.fail(null, null, 'validateAll did not reject with an error')
// or throw new Error('validateAll did not reject with an error')
})
/需要一个类似于的编译器,这个简单的抛出对我来说很有用
describe('Lead', () => {
it('should create a new lead', async () => {
throw 'not implemented'
})
})
仅在'then'函数中调用done回调的可能重复删除外部done函数,因为当它到达catch函数时,将没有done回调,因此它将自动显示超时错误,因为您只是在安慰outer,done通过了所有测试,所以绝对没有理由通过这样做而不是使用接受的答案来解决OP的问题。@Louis您是在说接受的答案吗建议将chai添加为另一个依赖项的答案?限制依赖似乎是一个合理的理由。@ken OP使用承诺。因此,解决方案应该利用摩卡理解承诺这一事实。这些天提出的问题中有一半是由于坚持使用
done
而导致的问题,而这一切都可以通过使用测试代码已经生成的承诺来简化。因为,请看,虽然可以使用带有承诺的done
,但它附带了一些重要的问题,这里的答案忽略了这些问题。至于依赖关系,一旦你超越了玩具代码,像承诺的那样依赖chai也不是什么大问题。@Louis你能扩展gotchas吗?@DanielKobe我已经改进了我的答案,因为我知道了导致测试失败的其他方法。
describe('Lead', () => {
it('should create a new lead', async () => {
throw 'not implemented'
})
})