Проверить маршрут и заглушить вызов функции внутри него? - PullRequest
0 голосов
/ 16 октября 2018

Можно ли заглушить функцию в маршруте 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 в приведенном выше сценарии?Я искал в Интернете несколько часов, но не нашел ни одной рабочей версии подобного дела.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Альтернативой использованию прокси-запроса является Избегайте использования импорта по умолчанию

Ваш db модуль выглядит как использование export default (он не экспортируется как символ) и сделать sinon не можетзаглушить это правильно.

Решение использует именованный экспорт

database.js

export function query() {
 // implementation
}

=== OR ===

function query() { .. }

module.exports = {
  query
}

stuff / controller.js

import * as db from '../lib/database'; // alternative => import { query } from '...'

const getStuff = async (req, res) => {
  const results = await db.query(req.id); // I want to stub this
  // ...
};

test / stuff / controller.js

import * as db from '../../apps/lib/database';

// ...

sandbox.stub(db, 'query').resolves({ thingy: 'bar', stuff: [ 123, 'wadsofasd' ] });

Ref:

0 голосов
/ 16 октября 2018

Вы пробовали proxyquire?

Proxyquire - это библиотека javascript, позволяющая обмануть требуемый файл node.js, чтобы вы могли передать ему другую функцию (свою заглушку), когда затем обнаружит require ('example / route /из / your / import ').

https://github.com/thlorenz/proxyquire

Таким образом, вы можете написать

    const proxyquire = require('proxyquire');

    proxyquire('./apps/stuff/controller', {
        getStuff: sandbox.stub()
    }
...