【问题标题】:Sinon stub not working if tested using express app如果使用 express 应用程序测试,Sinon 存根不起作用
【发布时间】:2020-06-22 00:04:32
【问题描述】:

我有一个如下所示的控制器功能。
SendOTPController.js

const otpService = require('../services/otpService')


module.exports = async function(req, res) {
                 const {error, data}  = await sendOTP(req.query.phone)
                 if(error)
                     return res.send(error)
                 return res.send(data)
}

otpService.js

module.exports = async function(phone) {
                await result = fetch(`http://api.send-otp?phone=${phone}`)
                if (result !== sucess)
                    return {
                        error: "Failed to send OTP!"
                        data: null
                    }
                 return {
                        error: null
                        data: result
                    }

}

下面是我的测试。

const expect = require('chai').expect
const request = require('supertest')
const sinon = require('sinon')
const rewire = require('rewire')
const SendOTPController= rewire('../../src/controllers/SendOTPController')
const app = require('../../src/app')

describe('GET /api/v1/auth/otp/generate', function () {
    it('should generate OTP', async () => {
        let stub = sinon.stub().returns({
            error: null,
            data: "OTP sent"
        })
        SendOTPController.__set__('sendOTPOnPhone', stub)
        const result = await request(app)
            .get('/api/v1/auth/otp/generate?phone=8576863491')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200)
        console.log(result.body)
        expect(stub.called).to.be.true
    })
})

在上面的代码中,stub 没有被调用。

但是,如果只使用控制器而不使用 express 应用程序,它可以正常工作。

const expect = require('chai').expect
const request = require('supertest')
const sinon = require('sinon')
const rewire = require('rewire')
const SendOTPController= rewire('../../src/controllers/SendOTPController')
const app = require('../../src/app')

describe('GET /api/v1/auth/otp/generate', function () {
    it('should generate OTP', async () => {
        let stub = sinon.stub().returns({
            error: null,
            data: "OTP sent"
        })
        SendOTPController.__set__('sendOTPOnPhone', stub)
        const result = await SendOTPController() // not using express app, hence not passing req, res 
        console.log(result)
        expect(stub.called).to.be.true
    })
})

我浏览了许多模块和文档。
他们提供了一个解决方案,我如何存根 module.exports = async function(){}
它们也可以工作,但前提是它们是直接导入和测试的。

如果我将它与 express 应用程序一起使用,它们将不起作用。
任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: node.js unit-testing express mocha.js chai


    【解决方案1】:

    尝试使用resolves,而不是returns

      let stub = sinon.stub().resolves({
            error: null,
            data: "OTP sent"
      })
    

    returns 用于同步代码,resolves 用于异步。

    【讨论】:

    • 不行,我以前试过这个。 app 正在创建自己的范围。这就是为什么它没有被存根。我们需要在全局范围内对它进行存根。看这里。 stackoverflow.com/questions/60599945/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2019-02-21
    • 2020-03-31
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多