Как заглушить JSON-файл с помощью Sinon - PullRequest
0 голосов
/ 04 июля 2019

У меня есть файл JSON, который мне требуется следующим образом:

const things = require('./path/to/things);

Я хочу поместить этот файл в песочницу, чтобы он всегда возвращал данное устройство.


const fixture = {
  fake: "things"
}

const sandbox = sinon.createSandbox();

beforeEach(() => {
  sandbox.stub(things).returns(fixture);
});

afterEach(() => {
  sandbox.restore();
});

Это приводит к ошибке returns is not a function.Я не уверен, как заглушить JSON с песочницей.Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вы можете заглушки только вызовы методов.В этом случае вызов require(...).Я думаю, у вас есть два варианта:

  1. Остановите функцию require.

    const sinon = require('sinon');
    const Module = require('module');
    const sandbox = sinon.createSandbox();
    sandbox.stub(Module.prototype, 'require').returns({fake:'things'});
    const things = require('./things/');
    console.log(JSON.stringify(things));
    

    Вот ссылка на ссылку выше: https://repl.it/repls/PessimisticSubtleHexagon

  2. Сделайте тестируемую систему зависимой от things и введите ее.Таким образом вы отделяете логику, которую хотите проверить, от оператора импорта.

0 голосов
/ 09 июля 2019

Другой подход заключается в использовании proxyquire , чтобы позволить require оператору возвращать mock json.

// noCallThru() is used to prevent call to the real JSON
// @see https://github.com/thlorenz/proxyquire#preventing-call-thru-to-original-dependency

const proxyquire = require('proxyquire').noCallThru();

const fixture = {
  fake: "things"
}

const src = proxyquire('./source-file', { './path/to/things': fixture });

beforeEach(() => {
  // empty
});

afterEach(() => {
 // empty
});

Надеюсь, это поможет

...