【问题标题】:How to test a callback in a callback using sinon?如何使用 sinon 在回调中测试回调?
【发布时间】:2019-02-18 02:24:28
【问题描述】:

我正在尝试让我的代码达到 100% 的覆盖率。

现在,我缺少的是这一行:

(err, result) => this.processDBResult(err, result, id, req, res, CLASS_NAME, METHOD_NAME, stopwatch)

 (accounttype) => globUtil.getConfig(accounttype, constant.BOOK,
            source => this.generateData(req, res, stopwatch, className, methodName, result, source))

我该如何继续这样做?

我尝试类似的东西:

getIdSpy.callsFake(() => {
    sinon.assert.callCount(processDBResultSpy, 4);      
});

但它总是会返回成功,我知道我的 processDBResultSpy 没有被调用 4 次,只有一次。

代码:

exports.getBookInfo = (req, res) => {

    let stopwatch = globUtil.startStopWatch();

    const METHOD_NAME = "getBookInfo";

    const id = req.params.id;
    const params = [id];

    if (globUtil.isId(id)) {
        bookDao.getBookById(params,
            (err, result) => this.processDBResult(err, result, id, req, res, CLASS_NAME, METHOD_NAME, stopwatch));

    } else {
        bookDao.getBookBySelfId(params,
            (err, result) => this.processDBResult(err, result, id, req, res, CLASS_NAME, METHOD_NAME, stopwatch));
    }
};

 exports.processDBResult = (err, result, id, req, res, className, methodName, stopwatch) => {

    if (err) {
        log.error(err);

        this.generateErrorResponse(req, res, 500, err, stopwatch, className, methodName);

        return;
    }

    if (result.length == 0) {
        log.info("No results");
        this.generateErrorResponse(req, res, 404, format(message.NOT_FOUND, id), stopwatch, className, methodName)

        return;
    }

    globUtil.getAccountType(id,
        (accounttype) => globUtil.getConfig(accounttype, constant.BOOK,
            source => this.generateData(req, res, stopwatch, className, methodName, result, source)));
}

测试用例:

it('1. getBookInfo - called with id', (done) => {
        let getIdSpy = sinon.stub(bookDao, "getBookById");
        let getSelfIdSpy = sinon.stub(bookDao, "getBookBySelfId");
        let processDBResultSpy = sinon.stub(controller, "processDBResult");

        let request = httpMocks.createRequest({
            method: 'GET',
            url: constant.MODULE_URL,
            params: {
                id: 'BOOKID'
            }
        });

        let response = httpMocks.createResponse();
        controller.getHdbInfo(request, response);

        sinon.assert.callCount(getIdSpy, 1);
        sinon.assert.callCount(getSelfIdSpy, 0);

        //how do i proceed form here

        done();
    });

【问题讨论】:

  • 好吧,如果您正在存根一个方法,那么您如何测试该方法调用回调?我建议删除存根并使用 spy 检查是否使用正确的参数调用回调。
  • @AvishekSaha 使用 spy 使我的应用程序运行我不希望它运行的访问数据库。所以我所做的就是产生我的存根调用。

标签: javascript node.js unit-testing callback sinon


【解决方案1】:

终于找到答案了。我所做的是产生我的方法。

it('1. getBookInfo - called with id', (done) => {
        let getIdSpy = sinon.stub(bookDao, "getBookById").yields(null, []);
        let getSelfIdSpy = sinon.stub(bookDao, "getBookBySelfId");
        let processDBResultSpy = sinon.stub(controller, "processDBResult");

        let request = httpMocks.createRequest({
            method: 'GET',
            url: constant.MODULE_URL,
            params: {
                id: 'BOOKID'
            }
        });

        let response = httpMocks.createResponse();
        controller.getHdbInfo(request, response);

        sinon.assert.callCount(getIdSpy, 1);
        sinon.assert.callCount(getSelfIdSpy, 0);

        //how do i proceed form here
        sinon.assert.callCount(processDBResultSpy, 1);

        done();
    });

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2021-06-07
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多