node.js - 如果使用 express 应用程序测试,Sinon 存根不起作用
问题描述
我有一个控制器功能,如下所示。
发送OTPController.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 应用程序一起使用,它们将不起作用。
任何帮助将不胜感激,谢谢。
解决方案
而不是returns
尝试使用resolves
:
let stub = sinon.stub().resolves({
error: null,
data: "OTP sent"
})
returns
用于同步代码,resolves
用于异步。
推荐阅读
- javascript - 使用 HTML 捕获树莓派相机的 webview 显示图片
- android - Retrofit2 GET注解动态url
- ios - iOS 和 Swift - 获取一个对象的屏幕位置来设置另一个对象的位置
- r - ggplot中数据框中的多个分组变量
- http - cookie 值中是否允许使用逗号。规格不清楚
- odbc - 如何为 UnixODBC 配置默认驱动程序?
- r - 根据 k-fold 交叉验证中的 fold 从训练数据中选择样本
- .htaccess - .htaccess 上的通配符重定向
- android - BLE Peripheral 的广告能否唤醒并触发与 Master Android 设备的连接?
- php - 从命令行与 PHP 运行脚本的不同结果