首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mocha、Chai和Sinon发出未处理的拒绝承诺警告

使用Mocha、Chai和Sinon发出未处理的拒绝承诺警告
EN

Stack Overflow用户
提问于 2018-03-27 02:33:36
回答 2查看 6K关注 0票数 2

我使用的是Node,并且有以下ES6类:

代码语言:javascript
复制
const moment = require('moment');

const sqlFileReader = require('../database/SqlFileReader');
const Lnfe = require('../errors/LoanNotFoundError');

const epoch = '1970-01-01';

/**
 * Take the input params and return the clientId (either found via loanId or untouched) and dateString we need
*/
class ParameterParser {

static async prepareInputParameters(con, req) {

    let clientId = req.query.client_id; // Will be overriden if we need and are able to obtain the client id via loan id.
    let dateString;

    // If no client_id is given but loan_id is, get the client_id via loan_id:
    if (typeof req.query.client_id === 'undefined' && typeof req.query.loan_id !== 'undefined') {
        const { retData } = await sqlFileReader.read('./src/database/sql/getClientIdFromLoanId.sql', [`${req.query.loan_id}`], con, req.logger);
        if (retData.rowsCount > 0) {
            clientId = retData.rows[0].client_id;
        }
        else {
            throw new Lnfe(400, req);
        }
    }

    if (typeof req.query.complaint_init_date === 'undefined') {
        dateString = epoch;
    }
    else {
        // Need to subtract 6 years from the complaint_init_date:
        dateString = moment(moment(req.query.complaint_init_date, 'YYYY-MM-DD').toDate()).subtract(6, 'years').format('YYYY-MM-DD');
    }

    return { clientId, dateString };
}

}

module.exports = ParameterParser;

我正在使用MochaChaiChai-as-PromisedSinon测试它

代码语言:javascript
复制
'use strict';

const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const sinon = require('sinon');

const parameterParser = require('../../src/core/ParameterParser.js');
const sqlFileReader = require('../../src/database/SqlFileReader.js');
const Lnfe = require('../../src/errors/LoanNotFoundError');

chai.use(chaiAsPromised);
const { expect } = chai;

const retData = {
rowsCount: 1,
rows: [{ client_id: 872 }],
};

const reqDateAndLoan = {
query: {
    complaint_init_date: '2022-03-15',
    loan_id: '1773266',
},
};

const reqDateAndClient = {
query: {
    complaint_init_date: '2022-03-15',
    client_id: '872',
},
};

const reqDateAndLoanIdThatDoesNotExist = {
query: {
    complaint_init_date: '2022-03-15',
    loan_id: '1773266999999999999',
},
};

describe('prepareInputParameters', () => {

sinon.stub(sqlFileReader, 'read').returns({ retData });

it('results in correct client id and date string', async () => {
    const ret = { clientId: 872, dateString: '2016-03-15' };
    expect(await parameterParser.prepareInputParameters(null, reqDateAndLoan)).to.deep.equal(ret);
});

it('results in a client id equal to the that input if the request query contains a client id', async () => {
    const ret = { clientId: '872', dateString: '2016-03-15' };
    expect(await parameterParser.prepareInputParameters(null, reqDateAndClient)).to.deep.equal(ret);
});

it('throws a \'Loan Not Found\' error', async () => {
    expect(parameterParser.prepareInputParameters(null, reqDateAndLoanIdThatDoesNotExist)).eventually.throw(Lnfe, 400, 'Loan Not Found');
});

it('DOES NOT throw a \'Loan Not Found\' error', async () => {
    expect(async () => {
        await parameterParser.prepareInputParameters(null, reqDateAndLoanIdThatDoesNotExist);
    }).to.not.throw(Lnfe, 400, 'Loan Not Found');
});


});

测试通过了,但输出有几个节点警告:

代码语言:javascript
复制
prepareInputParameters
✓ results in correct client id and date string
✓ results in a client id equal to the that input if the request query contains a client id
✓ throws a 'Loan Not Found' error
(node:23875) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: Loan Not Found: expected { Object (clientId, dateString) } to be a function
(node:23875) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
✓ DOES NOT throw a 'Loan Not Found' error


4 passing (19ms)

你知道我怎么才能摆脱这些警告,或者我做错了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-27 04:30:49

一些想法可以帮助你理解我用ES6类编译(示例)的promise的不同阶段:

// asyncpromiserejection.js

代码语言:javascript
复制
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
   //         reject();
    });
}
}
module.exports=asyncpromise

如果else部分被注释,promise将在true传递给类时解析,或者测试将超时,因为promise不知道当值为false时该如何处理。

// test.js

代码语言:javascript
复制
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");
})
})        
});

图1.0

取消对else部分的注释,您将得到相同的错误,但会出现promise rejection已弃用的警告-图1.1 -因为现在,尽管由于False值而导致的promise rejection在代码中得到了处理,但测试(即调用方法)并没有处理它。

代码语言:javascript
复制
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
            reject();
    });
}
}
module.exports=asyncpromise

图1.1

现在,像这样处理测试中的promise rejection:

代码语言:javascript
复制
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(()=>{console.log("Promise rejcted")})
})        
});

而且,您可以在promise的reject部分传递一些自定义消息,以便在测试中断言,如下所示:

代码语言:javascript
复制
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")
})
})        
});

// asyncpromiserejection.js

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2018-03-27 03:07:56

我用来捕获未处理的拒绝。

代码语言:javascript
复制
process.on('unhandledRejection', (err, p) => {
  console.error('unhandledRejection', err.stack, p)
})

所以我有了踪迹,我可以定位和修复

因为DeprecationWarning应该可以做到这一点--我不太确定,但是相应地使用文档https://nodejs.org/api/process.html#process_event_warning

代码语言:javascript
复制
process.on('warning', (warning) => {
  console.warn(warning.name);
  console.warn(warning.message);
  console.warn(warning.stack);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49498334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档