Заглушка Sinon не работает при тестировании с помощью приложения express - PullRequest
1 голос
/ 10 марта 2020

У меня есть функция контроллера, как показано ниже.
SendOTPController. js

const otpService = require('../services/otpService')


module.exports = async function(req, res) {
                 const {error, data}  = await sendOTP(req.query.phone)
                 if(error)
                     return res.send(error)
                 return res.send(data)
}

otpService. js

module.exports = async function(phone) {
                await result = fetch(`http://api.send-otp?phone=${phone}`)
                if (result !== sucess)
                    return {
                        error: "Failed to send OTP!"
                        data: null
                    }
                 return {
                        error: null
                        data: result
                    }

}

Ниже мой тест.

const expect = require('chai').expect
const request = require('supertest')
const sinon = require('sinon')
const rewire = require('rewire')
const SendOTPController= rewire('../../src/controllers/SendOTPController')
const app = require('../../src/app')

describe('GET /api/v1/auth/otp/generate', function () {
    it('should generate OTP', async () => {
        let stub = sinon.stub().returns({
            error: null,
            data: "OTP sent"
        })
        SendOTPController.__set__('sendOTPOnPhone', stub)
        const result = await request(app)
            .get('/api/v1/auth/otp/generate?phone=8576863491')
            .set('Accept', 'application/json')
            .expect('Content-Type', /json/)
            .expect(200)
        console.log(result.body)
        expect(stub.called).to.be.true
    })
})

В приведенном выше коде stub не вызывается.

Но если использовать только контроллер без приложения express, оно работает нормально.

const expect = require('chai').expect
const request = require('supertest')
const sinon = require('sinon')
const rewire = require('rewire')
const SendOTPController= rewire('../../src/controllers/SendOTPController')
const app = require('../../src/app')

describe('GET /api/v1/auth/otp/generate', function () {
    it('should generate OTP', async () => {
        let stub = sinon.stub().returns({
            error: null,
            data: "OTP sent"
        })
        SendOTPController.__set__('sendOTPOnPhone', stub)
        const result = await SendOTPController() // not using express app, hence not passing req, res 
        console.log(result)
        expect(stub.called).to.be.true
    })
})

Я прошел много модулей и документов.
Они дают решение, как я могу заглушить module.exports = async function(){}.
Они также работают, но только если они импортированы и протестированы напрямую.

Они не работают, если я использую его с приложением express.
Буду признателен за любую помощь, спасибо.

1 Ответ

0 голосов
/ 10 марта 2020

Вместо returns попробуйте использовать resolves:

  let stub = sinon.stub().resolves({
        error: null,
        data: "OTP sent"
  })

returns для кода syn c, resolves для asyn c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...