मैं OtpService में परिभाषित एक विधि doSendOtp को रोकने की कोशिश कर रहा हूं लेकिन स्टबिंग काम नहीं कर रहा है।

यह मोचा के साथ काम करता है, लेकिन एवा के साथ मुझे नहीं पता कि यह क्यों काम नहीं कर रहा है।

मैं इसे .serial का उपयोग करके कर रहा हूं लेकिन यह भी मदद नहीं करता है।

/* eslint-disable no-unused-expressions */
const test = require('ava');
const request = require('supertest');
const sinon = require('sinon');
const { expect } = require('chai');

const app = require('../src/app');
const OtpService = require('../src/components/auth/otp.service');

test.before(async (t) => {
  t.context.server = request(app);
  t.context.baseUrl = '/api/v1/auth';
});

test.after.always((t) => {
  delete require.cache[require.resolve('../src/app')]; // kills server
});

test.serial('Send OTP', async (t) => {
  const { server, baseUrl } = t.context;
  const sendOtpStub = sinon.stub(OtpService, 'doSendOtp');
  const response = await server.get(`${baseUrl}/send-otp?phone=7845489898`)
    .expect(200);
  expect(sendOtpStub.calledOnce).to.be.true;
  expect(response).to.be.a('Object');
});

परीक्षण विफलता त्रुटि।

Send OTP

  tests\auth.test.js:25

   24:     .expect(200);
   25:   expect(sendOtpStub.calledOnce).to.be.true;
   26:   expect(response).to.be.a('Object');

  Rejected promise returned by test. Reason:

  AssertionError {
    actual: false,
    expected: true,
    message: 'expected false to be true',
    showDiff: true,
  }

  » tests/auth.test.js:25:39

  ─

  1 test failed
npm ERR! Test failed.  See above for more details.

अपडेट करें: मैंने proxyquire का उपयोग करने का भी प्रयास किया लेकिन फिर भी OtpService के doSendOtp को रोकने में सक्षम नहीं था।

/* eslint-disable no-unused-expressions */
const test = require('ava');
const request = require('supertest');
const sinon = require('sinon');
const { expect } = require('chai');
const proxyquire = require('proxyquire');
const app = require('../src/app');

test.before(async (t) => {
  const sendOtpStub = sinon.stub().resolves({});
  proxyquire('../src/components/auth/auth.module', {
    './otp.service': {
      doSendOtp: sendOtpStub,
    },
  });
  t.context.stubs = {
    sendOtpStub,
  };
  t.context.baseUrl = '/api/v1/auth';
  t.context.server = request(app);
});

test.after.always((t) => {
  delete require.cache[require.resolve('../src/app')]; // kills
});

test.serial('Send OTP', async (t) => {
  const { server, baseUrl, stubs } = t.context;
  const response = await server.get(`${baseUrl}/send-otp?phone=8576863491`)
    .expect(200);
  expect(stubs.sendOtpStub.calledOnce).to.be.true;
  expect(response).to.be.a('Object');
});

// test.serial('Login', async (t) => {

// })
3
Sujeet Agrahari 6 अक्टूबर 2020, 11:13

1 उत्तर

सबसे बढ़िया उत्तर

मैंने इसे ठीक किया, मॉड्यूल लोड होने के बाद मैं स्टबिंग कर रहा था। मॉड्यूल लोड होने से पहले मुझे स्टब करने की आवश्यकता है।

/* eslint-disable no-unused-expressions */
const test = require('ava');
const request = require('supertest');
const sinon = require('sinon');
require('dotenv').config();

// dependency to be stubbed
const OtpService = require('../src/components/auth/otp.service');

// stubs
const sendOtpStub = sinon.stub(OtpService, 'doSendOtp').resolves({});

const app = require('../src/app');

test.before(async (t) => {
  t.context.stubs = {
    sendOtpStub,
  };
  t.context.baseUrl = '/api/v1/auth';
  t.context.server = request(app);
});

test.after.always((t) => {
  delete require.cache[require.resolve('../src/app')]; // kills server
});

test.serial('Send OTP', async (t) => {
  const { server, baseUrl, stubs } = t.context;
  const res = await server.get(`${baseUrl}/send-otp?phone=77979879878`);
  t.is(res.status, 200);
  t.true(stubs.sendOtpStub.calledOnce);
  t.true(typeof res === 'object');
});
2
Sujeet Agrahari 9 अक्टूबर 2020, 07:43