Можно ли заглушить функцию в маршруте Express с помощью Mocha и Sinon?
Вот реализация, в ./apps/stuff/controller.js
import db from '../lib/database';
const getStuff = async (req, res) => {
const results = await db.query(req.id); // I want to stub this
return res.status(200).json({
thingy: results.thingy,
stuff: [
results.foo,
results.bar,
],
});
};
export default {
getStuff,
};
И маршрут Express для нее, в./routes.js
import stuff from './apps/stuff/controller';
import express from 'express';
const app = express();
app.route('/stuff')
.get(stuff.getStuff);
Итак, в тестовом примере я хочу заглушить вызов на db.query()
и вместо этого вернуть пользовательский результат во время запроса GET /stuff
, когда тест выполняется.
// ./test/stuff/controller.js
import db from '../../apps/lib/database';
import chai from 'chai';
import chaiHttp from 'chai-http';
import server from '../../index';
const { expect } = chai;
chai.use(chaiHttp);
describe('getStuff', () => {
it('gets you stuff', async () => {
// I have tried this, but it results in TypeError: Cannot stub non-existent own property query
// I presume it is creating a new "empty" object instead of stubbing the actual implementation
sandbox.stub(db, 'query').resolves({ thingy: 'bar', stuff: [ 123, 'wadsofasd' ] });
chai.request(server)
.get('/stuff?id=123')
.then(res => {
expect(res).to.have.status(200);
expect(res.body).to.deep.equal({
thingy: 'bar',
stuff: [
123,
'wadsofasd',
]
});
});
});
});
Как правильно заглушить / смоделировать вызов db.query в приведенном выше сценарии?Я искал в Интернете несколько часов, но не нашел ни одной рабочей версии подобного дела.