【问题标题】:sinon stub not replacing functionsinon 存根不替换功能
【发布时间】:2017-04-09 21:01:28
【问题描述】:

我正在尝试使用 sinon 存根来替换可能需要花费时间的函数。但是当我运行测试时,测试代码似乎没有使用 sinon 存根。

这是我要测试的代码。

function takeTooLong() {
    return  returnSomething();
}

function returnSomething() {
    return new Promise((resolve) => {
        setTimeout(() => {
          resolve('ok')
        }, 1500)
    })
}

module.exports = {
  takeTooLong,
  returnSomething
}

这是测试代码。

const chai = require('chai')
chai.use(require('chai-string'))
chai.use(require('chai-as-promised'))
const expect = chai.expect
chai.should()
const db = require('./database')
const sinon = require('sinon')
require('sinon-as-promised')

describe('Mock the DB connection', function () {

it('should use stubs for db connection for takeTooLong', function (done) {

    const stubbed = sinon.stub(db, 'returnSomething').returns(new Promise((res) => res('kk')));
    const result = db.takeTooLong()

    result.then((res) => {

        expect(res).to.equal('kk')
        sinon.assert.calledOnce(stubbed);
        stubbed.restore()
        done()
    }).catch((err) => done(err))

})

我收到一个断言错误

 AssertionError: expected 'ok' to equal 'kk'
      + expected - actual

  -ok
  +kk

我做错了什么?为什么不使用存根? Mocha 中的测试框架。

【问题讨论】:

  • 您能否在您正在测试的代码和测试代码中添加您的exportrequire 方法?

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


【解决方案1】:

Sinon 存根对象的property,而不是函数本身。

在您的情况下,您是在一个对象中导出该函数。

module.exports = {
  takeTooLong,
  returnSomething
}

因此,为了正确地从对象调用函数,您需要将函数调用替换为对导出对象的引用,例如:

function takeTooLong() {
    return module.exports.returnSomething();
}

当然,根据你的代码,你总是可以重构它:

var exports = module.exports = {

    takeTooLong: function() { return exports.returnSomething() }

    returnSomething: function() { /* .. */ }

}

【讨论】:

【解决方案2】:

您可能想看看 Proxyquire 以 stub/spy 直接导出的函数。 https://www.npmjs.com/package/proxyquire/

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2020-09-07
    • 2019-04-03
    • 2016-09-30
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多