Я пишу тесты для express API. Я использую тип зависимости от proxyquire
до stub
module.exports = someFunction()
.
У меня есть защищенный маршрут, поэтому я использовал proxyquire
для заглушки auth
промежуточного ПО.
Это auth
промежуточное ПО будучи заглушенным.
В контроллере у меня есть модель, которая вычисляет строки из дБ. Я тоже хочу заглушить этот.
Так как этот метод привязан к модели 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(){}
}
address.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
}
});
Адрес. 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
не вызывается.