如何用 Sinon 存根 JSON 文件

How to stub a JSON file with Sinon

我有一个 JSON 文件,我需要按以下方式:

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

我想在沙盒中存根这个文件,所以它总是 returns 一个给定的夹具。


const fixture = {
  fake: "things"
}

const sandbox = sinon.createSandbox();

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

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

这会导致错误 returns is not a function。我不确定如何使用沙箱存根 JSON。谁能帮帮我?

您只能存根方法调用。在这种情况下,调用是 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));
    

    这是对上述内容的回复link:https://repl.it/repls/PessimisticSubtleHexagon

  2. 让你的测试系统依赖于things并注入它。这样您就可以将要测试的逻辑与导入语句分离。

另一种方法是使用 proxyquire 允许 require 语句 return 模拟 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
});

希望对您有所帮助