Sinon存根正在调用实际的异步方法而不是存根

问题描述 投票:0回答:1

我有一个具有异步功能的中介者times.js文件,如下所示。在运行Mocha Chai单元测试时,不会发生processTimes()的存根。不知道出了什么问题。感谢您的帮助。

async function getTimes (request, response) {
    let slots;
    .....
    slots = await processTimes(params, promises);
    .....
    response.status(200).json(slots);
}

async function processTimes (params, promises) {
    return Promise.all(promises).then(function (data) {
        return slots;
    }
}

和如下测试spec times_spec.js。

const chai = require("chai");
const sinon = require("sinon");
const timesMediator = require("times");
describe("times mediator", function () {
var mockResponse = {
    set: (key, value) => {
    },
    status: function (code) {
      return {
        json: function (json) {
          expect(json).not.to.be.empty;
          ... //some assertions here.
        },
      };
    },
  };
  beforeEach(function () {

  });
afterEach(function (done) {
    sinon.restore();
    done();
  });

    it("times", async () => {
        sinon.stub(timesMediator, "processTimes").resolves({"a":"A","b":"B"}});
    }
    timesMediator.getTimes(mockRequest, mockResponse);
}
javascript mocha sinon chai
1个回答
0
投票

这里是单元测试解决方案:

index.ts

exports.getTimes = async function getTimes(request, response) {
  let slots;
  const params = {};
  const promises = [Promise.resolve(1), Promise.resolve(2)];
  slots = await exports.processTimes(params, promises);
  response.status(200).json(slots);
};

exports.processTimes = async function processTimes(params, promises) {
  return Promise.all(promises);
};

index.spec.ts

import sinon from 'sinon';
const timesMediator = require('./');
import { expect } from 'chai';

describe('timesMediator', () => {
  afterEach(() => {
    sinon.restore();
  });
  it('#getTimes', async () => {
    const mProcessTimesResponse = [{ a: 'A', b: 'B' }] as any;
    const mReq = {};
    const mRes = {
      status: sinon.stub().returnsThis(),
      json: sinon.stub()
    };
    const stub = sinon.stub(timesMediator, 'processTimes').resolves(mProcessTimesResponse);
    await timesMediator.getTimes(mReq, mRes);
    expect(stub.calledWith({}, sinon.match.array)).to.be.true;
    expect(mRes.status.calledWith(200)).to.be.true;
    expect(mRes.json.calledWith(mProcessTimesResponse)).to.be.true;
  });

  it('#processTimes', async () => {
    const actualValue = await timesMediator.processTimes({}, [Promise.resolve(1)]);
    expect(actualValue).to.eql([1]);
  });
});

单元测试结果覆盖率100%:

timesMediator
    ✓ #getTimes
    ✓ #processTimes


  2 passing (13ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |      100 |      100 |                   |
 index.spec.ts |      100 |      100 |      100 |      100 |                   |
 index.ts      |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

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

© www.soinside.com 2019 - 2024. All rights reserved.