当前位置: 首页 > 知识库问答 >
问题:

Sinon存根不替换功能

申查猛
2023-03-14

我正在尝试使用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

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

共有2个答案

齐典
2023-03-14

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

乜嘉悦
2023-03-14

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

在本例中,您是在对象中导出该函数。

module.exports = {
  takeTooLong,
  returnSomething
}

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

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

当然,根据您的代码,您可以随时对其进行重构:

var exports = module.exports = {

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

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

}

 类似资料:
  • 我尝试了一个虚拟模块,并存根,但不工作。 应用程序.js test.js 我尝试了以下建议:sinon stub不替换函数 但还是一样。它不能取代功能。

  • 我有一个依赖于另一个函数的函数,而不是测试依赖关系,我只想测试依赖函数的特定结果。然而,当我存根函数时,什么都不会发生,返回的结果就好像我从来没有存根函数一样。 示例代码:

  • 我正在尝试测试点击一种反应成分,以利用酶Sinon 我的Comp组件有一个引发异常的保存功能 当我运行测试时,我希望不会抛出任何错误,并且存根中的空函数会被触发——但事实并非如此。组件内部的实际函数被触发,而不是空的存根。

  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对

  • 我正在尝试测试一个es6类,但我不知道如何用sinon存根一个函数模块。测试不是sm下的覆盖线。callSoap函数 我试试这个: module.js index.js(这是模块的索引) my-class.js test.js 我尝试在soapModule上存根,但生成了以下错误: 无法存根不存在的自己的属性call Soap

  • 如果我已经通过< code > var a = sinon . createstuinstance(my contractor)创建了一个实例。 如何替换其中一个存根函数,如 。 我这样做的主要原因是想实现这个提到的多个回调解决方法