用sinon在一个类的实例上存根方法

时间:2018-06-06 17:18:45

标签: javascript sinon

我刚开始尝试使用sinon并尝试获取存根。我正在尝试测试一个接收请求对象的函数,从中获取一些属性,并将其传递给一个对外部服务发出get请求的类的实例。

前:

exports.getMyThings = (req) => {
  const reqOpts = {
    qs: req.query
  };

  return apiInstance.get(req.route, reqOpts);
};

apiInstance在我导出getMyThings函数的文件中实例化。

我正在尝试删除apiInstance.get方法,以便我可以测试我的getMyThings函数是否正常工作并传递正确的参数。

我尝试通过将类导入到我的测试文件中来编写存根,然后创建存根实例:

const MyClass = require('.../blahblah)
const apiInstance = sinon.createStubInstance(MyClass);

const apiInstance = new MyClass();
apiInstance.get = sinon.stub();

但在我的getMyThings函数中,apiInstance.get方法不是包装的方法 - 它是原始方法。包装的实例仅存在于我的测试中。这是有道理的,但我不知道如何解决它。任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:0)

您可以使用

const returnMe = () => 'sinon rocks!';
sinon.stub(apiInstance, 'get').callsFake(returnMe);


result = apiInstance.get();
// Do asssertion for result to equal to the returnMe();

希望有帮助。

答案 1 :(得分:0)

这是单元测试解决方案:

index.js

const MyClass = require("./api");
const apiInstance = new MyClass();

exports.getMyThings = (req) => {
  const reqOpts = {
    qs: req.query,
  };

  return apiInstance.get(req.route, reqOpts);
};

api.js

function MyClass() {}
MyClass.prototype.get = async function get(route, reqOpts) {
  return "real data";
};

module.exports = MyClass;

index.test.js

const { getMyThings } = require("./");
const sinon = require("sinon");
const { expect } = require("chai");
const MyClass = require("./api");

describe("50726074", () => {
  afterEach(() => {
    sinon.restore();
  });
  it("should pass", async () => {
    const getStub = sinon.stub(MyClass.prototype, "get").resolves("fake data");
    const mReq = { route: "/api/thing", query: { id: "1" } };
    const actual = await getMyThings(mReq);
    expect(actual).to.be.equal("fake data");
    sinon.assert.calledWith(getStub, "/api/thing", { qs: { id: "1" } });
  });
});

带有覆盖率报告的单元测试结果:

  50726074
    ✓ should pass


  1 passing (37ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |    95.24 |      100 |    83.33 |    95.24 |                   |
 api.js        |    66.67 |      100 |       50 |    66.67 |                 3 |
 index.js      |      100 |      100 |      100 |      100 |                   |
 index.test.js |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/50726074