Как заглушить функцию-обертку с помощью Sinon? - PullRequest
1 голос
/ 05 апреля 2019

Я настраиваю лямбда-функцию (node.js) и, например, ради этого мы будем сохранять ее минимальной.

module.exports = (event, context, callback) {
  console.log("hello world")
}

Однако я создал функцию для переноса лямбда-функцииэто позволяет мне выполнять некоторые функции, которые требуются перед выполнением каждой лямбды (у меня есть коллекция лямбда-функций, которые подключены с использованием их модели серверного приложения (SAM) ).Это также позволяет мне объединить некоторые записи и обработку ошибок для каждой функции.

// hook.js
const connect = fn => (event, context, callback) => {
  someFunction()
    .then(() => fn(event, context, callback))
    .then(res => callback(null, res))
    .catch(error => {
      // logging
      callback(error)
    })
}

module.exports = { connect }

// index.js
const Hook = require("./hook")

exports.handler = Hook.connect((event, context, callback) => {
  console.log("hello world")
})

Логика работает хорошо, и Lambda успешно ее обрабатывает.Тем не менее, я пытаюсь заглушить эту Hook.connect функцию, используя SinonJS и нуждаюсь в некотором руководстве.

Я просто хочу заглушить ее, чтобы вернуть выполненное обещание, таким образом, мы можемприступим к обработке кода внутри каждой лямбда-функции (fn(event, context, callback)).

const sinon = require("sinon")
const Hook = require("./hook")
const { handler } = require("./index")
const event = {} // for simplicity sake
const context = {} // for simplicity sake
const callback = {} // for simplicity sake

describe("Hello", () => {
  let connectStub

  beforeEach(() => {
    connectStub = sinon.stub(Hook, "connect").callsFake()

  afterEach(() => {
    connectStub.restore()
  })

  it("works", () => {
    const results = handler(event, context, callback)
    // assert
  })
})

Я пробовал несколько разных методов, от базового, sinon.stub(Hook, "connect"), до более сложного, где я пытаюсьчтобы заглушить частные функции внутри hook.js файла, используя rewire .

Буду признателен за любую помощь - заранее спасибо.

1 Ответ

2 голосов
/ 06 апреля 2019

Вот рабочий тест:

const sinon = require('sinon');
const Hook = require('./hook');

const event = {}; // for simplicity sake
const context = {}; // for simplicity sake
const callback = {}; // for simplicity sake

describe('Hello', () => {

  let handler, connectStub;
  before(() => {
    connectStub = sinon.stub(Hook, 'connect');
    connectStub.callsFake(fn => (...args) => fn(...args));  // create the mock...
    delete require.cache[require.resolve('./index')];  // (in case it's already cached)
    handler = require('./index').handler;  // <= ...now require index.js
  });

  after(() => {
    connectStub.restore();  // restore Hook.connect
    delete require.cache[require.resolve('./index')];  // remove the modified index.js
  });

  it('works', () => {
    const results = handler(event, context, callback);  // it works!
    // assert
  });
});

Детали

index.js вызывает Hook.connect для создания экспортируемого handler , как только он запускает , и запускает , как только это required ...

... так что макет для Hook.connect должен быть на месте до того, как index.js будет required:

Node.js кэширует модули , поэтому этот тест также очищает кэш Node.js до и после теста, чтобы убедиться, что index.js подхватывает макет Hook.connect, и чтобы убедиться, что index.js с поддельным Hook.connect удалено из кэша на случай, если реальный index.js потребуется позже.

...