Sinon存根未与module.exports一起使用= {f1,f2}

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

我有这个发送otp的文件,如下所示。

OtpService.js

const generateOTP = async function() {
 //
}

const verifyOTP = async function() {
//
}

module.exports = {
 generateOTP,
 verifyOTP
}

下面是使用这些方法的控制器otp.js

const { verifyOTP, generateOTP } = require('../../services/OtpService')

const verify = async function(req, res) {
 const {error, data} = await generateOTP(req.query.phone)
}

const send = async function(req, res) {
 const {error, data} = await verifyOTP(req.query.phone, req.query.otp)
}

module.exports = {
 send,
 verify
}

下面是测试文件otp.test.js

const sinon = require('sinon');
const expect = require('chai').expect
const request = require('supertest')
const OtpService = require('../../src/services/OtpService')
console.log(OtpService)
describe('GET /api/v1/auth/otp', function() {
  let server 
  let stub
  const app = require('../../src/app')
  stub = sinon.stub(OtpService, 'generateOTP').resolves({
    error: null,
    data: "OTP Sent"
  })
  server = request(app)
  it('should generate OTP', async () => {
    const result = await server
        .get('/api/v1/auth/otp/send?phone=7845897889')
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(200)
        console.log(result.body)
    expect(stub.called).to.be.true
    expect(result).to.be.a('Object')
  });
});

上面不起作用,在控制器中调用时,它没有对generateOTPverifyOTP方法进行存根。

但是,如果我在OtpService.generateOTP()中调用otp.test.js,则它在那里工作,但是在控制器中不起作用。

Sinon如何在这里工作?

我在这里很困惑。要求应用程序然后存根正确还是先存根然后需求正确?

我都尝试过两种方法,尽管它们都不起作用。我也尝试使用before() and beforeEach()

下面是我的文件夹结构。

enter image description here

[otp.js(控制器)在这里controller->AuthController->otp.js

[otp.test.js在这里test->auth->otp.test.js

[OtpService.js就在services之内

更新

我发现了问题。如果我不在控制器中使用销毁功能,则一切正常。因此,使用OtpService.generateOTP是可行的。

问题在于对象的破坏。

const { verifyOTP, generateOTP } = require('../../services/OtpService')

以上在存根之前正在运行。因此verifyOTPgenerateOTP已经具有对unstubbed方法的引用。

我需要一种解决方法。我想使用破坏功能。

javascript node.js integration-testing sinon supertest
1个回答
0
投票

我使用proxyquire程序包存根OtpService模块。下面的示例是单元测试,但是您可以将这种方式用于集成测试。

例如

otp.js

const { verifyOTP, generateOTP } = require('./OtpService');

const verify = async function(req, res) {
  return generateOTP(req.query.phone);
};

const send = async function(req, res) {
  return verifyOTP(req.query.phone, req.query.otp);
};

module.exports = {
  send,
  verify,
};

OtpService.js

const generateOTP = async function() {
  //
};

const verifyOTP = async function() {
  //
};

module.exports = {
  generateOTP,
  verifyOTP,
};

otp.test.js

const proxyquire = require('proxyquire');
const sinon = require('sinon');

describe('60704684', () => {
  it('should send', async () => {
    const otpServiceStub = {
      verifyOTP: sinon.stub().resolves({ error: null, data: 'fake data' }),
      generateOTP: sinon.stub(),
    };
    const { send } = proxyquire('./otp', {
      './OtpService': otpServiceStub,
    });
    const mReq = { query: { phone: '123', otp: 'otp' } };
    const mRes = {};
    await send(mReq, mRes);
    sinon.assert.calledWithExactly(otpServiceStub.verifyOTP, '123', 'otp');
  });

  it('should verfiy', async () => {
    const otpServiceStub = {
      verifyOTP: sinon.stub(),
      generateOTP: sinon.stub().resolves({ error: null, data: 'fake data' }),
    };
    const { verify } = proxyquire('./otp', {
      './OtpService': otpServiceStub,
    });
    const mReq = { query: { phone: '123' } };
    const mRes = {};
    await verify(mReq, mRes);
    sinon.assert.calledWithExactly(otpServiceStub.generateOTP, '123');
  });
});

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

  60704684
    ✓ should send (1744ms)
    ✓ should verfiy


  2 passing (2s)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |     100 |      100 |      50 |     100 |                   
 OtpService.js |     100 |      100 |       0 |     100 |                   
 otp.js        |     100 |      100 |     100 |     100 |                   
---------------|---------|----------|---------|---------|-------------------

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60704684

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