Заглушка метода экземпляра класса с помощью sinon

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

Ex:

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 не завернутый, а оригинальный. Обернутый экземпляр существует только внутри моего теста. Это имеет смысл, но я не уверен, как обойти это. Любые идеи приветствуются.


person Leigh Scherrer    schedule 06.06.2018    source источник
comment
Я не нашел решения, но обходной путь, который я использовал, — это просто экспортировать apiInstance и импортировать его в мой тестовый файл. Это работает.   -  person Leigh Scherrer    schedule 06.06.2018


Ответы (2)


Ты можешь использовать,

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


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

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

person unnamed-bull    schedule 05.12.2018

Вот решение модульного теста:

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

person slideshowp2    schedule 27.12.2019