Я пытаюсь stub
module.exports
функция. Но у меня есть некоторые проблемы. Я дам вам sudo-код ситуации.
MyController. js
const sendOTPOnPhone = rewire('../../src/services/OtpService/sendOTPOnPhone')
module.exports = async function(req, res) {
const { error, data } = await sendOTPOnPhone(req.query.phone) //this is I want to stub
if(error)
return return res.send(error)
return res.send(data)
}
sendOTPService. js
module.exports = async function(phone) {
const result = await fetch(`external-api-call`)
if(result.status !== 'success')
return {
error: "Failed to send OTP!",
data: null
}
return {
error: null,
data: result
}
}
sendOTPTest. js
const expect = require('chai').expect
const request = require('supertest')
const sinon = require('sinon')
const rewire = require('rewire')
const sendOTPOnPhone = rewire('../../src/services/OtpService/sendOTPOnPhone')
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"
})
sendOTPOnPhone.__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)
expect(stub.calledOnce).to.be.true
console.log(result.body)
// expect(result).to.equal('promise resolved');
})
})
Приведенный выше тест не пройден, заглушка не вызывается. Я не знаю, что мне не хватает? Если я делаю это в моем sendOTPService:
const sendOTP = async function() {}
module.exports = {
sendOTP
}
и это в контроллере.
const { error, data } = sendOTPOnPhone.sendOTPOnPhone(req.query.phone)
Это работает.
Но я импортирую его как const {sendOTPOnPhone } = require('../sendOTPService')
Это не работает.
Я знаю, что деструкция меняет ссылку на объект.
Может кто-нибудь предложить обходной путь?
Можно ли добиться этого с помощью rewire
? ИЛИ Это можно сделать с помощью proxyquire
.
Пожалуйста, кто-нибудь может предложить?