node.js测试promise会导致Error:Promise被拒绝,没有或有错误的原因

时间:2018-03-21 16:54:46

标签: node.js promise mocha es6-promise

运行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

那么我做错了什么?

3 个答案:

答案 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");
})
})        
});

enter image description here

然而,如果您在测试中使用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")
})
})        
});

enter image description here