我正在为快速 API 编写测试。我proxyquire
习惯于stub
module.exports = someFunction()
依赖类型。
我有一条受保护的路线,所以我曾经proxyquire
存根auth
中间件。
这个auth
中间件正在被存根。
在控制器中,我有一个模型,它从 db 中提取行。我也想把这个存根。
因为这是一种附加到模型的方法UserAddress
。我可以直接用sinon
.
像下面let findUserAddressStub = sinon.stub(UserAdress, 'findAll').resolves({ adddre1: "address1", address2: "address2"})
但是上面的代码不起作用。findAll
方法没有被存根。
我认为proxyquire
是搞乱scope
的express app
。
我试图用它proxyquire
自己存根。
但我不知道导出对象时如何存根单个方法?
modules.exports = {
findAll: function(){},
findOne: function(){}
}
地址.test.js
const expect = require('chai').expect
const request = require('supertest')
const _ = require('lodash')
const sinon = require('sinon')
const proxyquire = require('proxyquire')
const {
UserAddress
} = require('../../src/models')
describe('User Address /api/v1/user/addresses', function () {
let authStub = sinon.stub().callsFake(function(req, res,next) {
next()
})
authStub['@global'] = true
const app = proxyquire('../../src/app', {
'./middlewares/auth': authStub
});
it('GET /api/v1/user/addresses', async () => {
let findUserAddressStub = sinon.stub(UserAddress, 'findAll').resolves({
id: "Z",
address_line_1: null,
address_line_2: null,
city: null,
state: "Bengaluru",
pincode: null,
is_deleted: false,
landmark: null,
map_lat: null,
map_lng: null,
label: null,
service_area_id: null
})
const result = await request(app)
.get('/api/v1/user/addresses')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
expect(findUserAddressStub.calledOnce).to.be.true
expect(result)
.to.be.a('Object')
})
})
更新
我也试过下面的代码。但它仍然无法正常工作。
const app = proxyquire('../../src/app', {
'./middlewares/auth': authStub,
'./models/useraddress': {
'findAll': findUserAddressStub
}
});
Address.js(控制器)
//Models
const {
UserAddress
} = require('../../models')
const getAddresses = async function(req, res, next) {
const addresses = await UserAddress.findAll({
where: {
user_id: req.user.id,
is_deleted: false
},
attributes: {
exclude: ["user_id", "created_by", "updated_by", "created_on", "updated_on"]
},
...paginate(+req.query.page, +req.query.per_page)
})
return res.status(200).send({
status: true,
message: "Successfully fetched addresses!",
data: addresses
})
}
当用户通过身份验证时,我将 user_id 嵌套到中间件req
内部auth
并将其传递给路由处理程序。
所以我也在下面尝试
let authStub = sinon.stub().callsFake(function(req, res,next) {
req.user = {}
req.user.id = 3
next()
})
但是,仍然findUserAddressStub
没有被调用。