运行Mocha时,我收到错误:
错误:承诺被拒绝,没有或有错误的原因
关于promise函数我试图为。编写测试。
我有一个这样的课程:
class Parser {
constructor(jobName, jobExchange) {
this.jobName = jobName;
this.jobExchange = this.jobExchange;
}
parse(job) {
return new Promise( (resolve, reject ) => {
let jobJSON = JSON.parse(job.content);
return this._isRelevant(jobJSON) ? resolve(jobJSON) : reject();
});
}
_isRelevant(job) {
return job.exchange_name === this.jobExchange &&
job.__CLASS__ === this.jobName;
}
}
module.exports = new Parser(process.env.AMQP_JOB, process.env.AMQP_EXCHANGE);
然后进行类似的测试:
const parser = require('../../job/Parser');
describe('Parser', () => {
describe('parse', () => {
it('resolves', async () => {
let job = {
content: '{"__CLASS__": "abc","exchange_name": "abc"}'
}
const result = await parser.parse(job);
expect(result).to.equal('promise resolved');
});
// it('rejects', async () => {
// });
});
});
我从命令行运行我的测试,例如:env AMQP_JOB=abc AMQP_EXCHANGE=abc mocha
那么我做错了什么?
答案 0 :(得分:1)
在这一行:
return this._isRelevant(jobJSON) ? resolve(jobJSON) : reject();
你拒绝没有参数的承诺。您应该使用类似new Error('job not relevant')
的内容拒绝它。
通常,当承诺返回到mocha拒绝时,mocha将显示您提供的任何错误。在这种情况下,既然你没有提供一个,那么你就会发现这个“无益”。而不是消息。
与其他人一样,我真的很想知道为什么你要使解析方法异步。 :\
答案 1 :(得分:0)
可能有助于发现您的错误。
您可以将您的承诺包装在try / catch中或使用传统承诺.then()
/ .catch()
try {
const result = await parser.parse(job);
}catch(err) {
console.log('err', err)
}
或
await parser.parse(job).then(res => {
console.log(result)
}).catch(err => {
console.log('err', err)
})
答案 2 :(得分:0)
// asyncpromiserejection.js
class asyncpromise{
constructor(s){
this.s=s
}
PTest(){
var somevar = false;
somevar=this.s;
return new Promise(function (resolve, reject) {
if (somevar === true)
resolve();
else
// throw new Error("Promise rejcted")
reject();
});
}
}
module.exports=asyncpromise
// test.js
const assert=require('chai').assert
const asyncpromise=require('./asyncpromiserejection.js')
describe("asyncTests", () => {
it("handles Promise rejection",async ()=>{
var t=new asyncpromise(false)
await t.PTest().then(function () {
console.log("Promise Resolved");
})
})
});
然而,如果您在测试中使用catch
,则会处理空承诺的承诺拒绝,如下所示:
const assert=require('chai').assert
const asyncpromise=require('./asyncpromiserejection.js')
describe("asyncTests", () => {
it("handles Promise rejection",async ()=>{
var t=new asyncpromise(false)
await t.PTest().then(function () {
console.log("Promise Resolved");
}).catch((error)=>{
console.log("Promise rejected")
// assert.equal(error.message,"Promise rejected")
})
})
});