Озвучивание экспресс-функций промежуточного ПО с помощью sinon - PullRequest
0 голосов
/ 30 августа 2018

Описание

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

Что я пытаюсь (как воспроизвести)

Я пытаюсь использовать заглушку sinon с помощью функции callsFake, как советовали их самые последние документы.

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

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

Это функция, которую я пытаюсь заглушить, она определена как функция и тоже экспортирована как объект. Он определен в файле сценария с путем, подобным api/middlewares/stripe/signature.

const stripeHelper = require('../../../lib/stripe')
const logger = require('../../../lib/logger')
const verifySignature = (req, res, next) => {
  var event
  let eventName = req.url.replace('/', '')
  try {
      // Try adding the Event as `request.event`
    event = stripeHelper.signatureCheck(
        eventName,
        req.body,
        req.headers['stripe-signature']
      )
  } catch (e) {
      // If `constructEvent` throws an error, respond with the message and return.
    logger.error('Error while verifying webhook request signature', e.message, e)
    return res.status(400).send('Webhook Error:' + e.message)
  }
  req.event = event
  next()
}
module.exports.verifySignature = verifySignature

Что я уже пробовал

  • Используйте decache, чтобы убедиться, что экземпляр экспресс-приложения нетронут и не инициализируется с предыдущим исходным промежуточным программным обеспечением
  • Установите несколько beforEach хуков для организации моих заглушек и предварительных условий или теста

Что продолжает происходить

  • Оригинальная функция промежуточного программного обеспечения выполняется
  • Я не вижу никаких журналов функций заглушки (как второе доказательство того, что заглушка sinon не работает

Это мои настройки заглушек и тестовых зацепок:

const chai = require('chai')
const chaiHttp = require('chai-http')
const dirtyChai = require('dirty-chai')
const sinon = require('sinon')
const decache = require('decache')
const signatureMiddleware = require('../../../api/middlewares/stripe/signature')
const bp = require('body-parser')
let verifySignatureStub, rawStub

chai.should()
chai.use(dirtyChai)
chai.use(chaiHttp)

const API_BASE = '/api/subscriptions'
const planId = 'NYA-RUST-MONTHLY'
const utils = require('../../utils')
const {
  hooks: {createSubscription, emitPaymentSucceeded},
  stripe: {generateEventFromMock}
} = utils

let testUser, testToken, testSubscription, server

describe.only('Subscriptions renewal (invoice.payment_succeeded)', function () {
  this.timeout(30000)

  beforeEach(function (done) {
    createSubscription(server, {planId}, function (err, resp) {
      if (err) return done(err)
      const {user, jwt, subscription} = resp
      console.log(user, jwt)
      testUser = user
      testToken = jwt
      testSubscription = subscription
      done()
    })
  })

  beforeEach(function (done) {
    verifySignatureStub = sinon.stub(signatureMiddleware, 'verifySignature')
    rawStub = sinon.stub(bp, 'raw')
    rawStub.callsFake(function (req, res, next) {
      console.log('bp raw')
      return next()
    })
    verifySignatureStub.callsFake(function (req, res, next) {
      const {customerId} = testUser.stripe
      const subscriptionId = testSubscription.id
      console.log('fake verify')
      req.event = generateEventFromMock('invoice.payment_failed', {subscriptionId, customerId, planId})
      return next()
    })
    done()
  })

  beforeEach(function (done) {
    decache('../../../index')
    server = require('../../../index')
    const {customerId} = testUser.stripe
    const {id: subscriptionId} = testSubscription
    console.log(`emitting payment succeeded with ${customerId}, ${subscriptionId} ${planId}`)
    emitPaymentSucceeded(server, testToken, function (err, response) {
      if (err) return done(err)
      done()
    })
  })

  afterEach(function (done) {
    verifySignatureStub.restore()
    done()
  })

  it('Date subscription will renew gets set to a valid number roughly one month', function () {
    // Not even getting here becasue calling the original function contains verifyMiddleware which should be replaced
  })

  it('Current period end is modified')

  it('An invoice for the new starting period is generated')

  it('Subscription status keeps active')
})

Контекст (пожалуйста, заполните следующую информацию):

Все работает над узлом 8, и я провожу тесты с мокко и выполнил настройку с грязным чаем.

Это мои зависимости от разработчиков:

"devDependencies": { "base64url": "^2.0.0", "cross-env": "^5.0.5", "decache": "^4.4.0", "dirty-chai": "^2.0.1", "faker": "^4.1.0", "google-auth-library": "^0.12.0", "googleapis": "^23.0.0", "minimist": "^1.2.0", "mocha": "^5.2.0", "nodemon": "^1.12.0", "nyc": "^11.2.1", "sinon": "^6.1.5", "standard": "^10.0.3", "stripe-local": "^0.1.1" }

Открытый выпуск

https://github.com/sinonjs/sinon/issues/1889

1 Ответ

0 голосов
/ 30 августа 2018

Как правило, заглушки должны быть настроены для каждого теста, т. Е. В beforeEach или it, а не в before. Здесь они, кажется, не содержат логику для каждого теста, но могут, и в этом случае они не будут работать так, как ожидалось с before. mocha-sinon предпочтительно использовать для интеграции Mocha с песочницей Sinon, поэтому afterEach не требуется для восстановления заглушек, это делается автоматически.

Поскольку verifySignature является свойством экспорта, а не самим экспортом, модуль signatureMiddleware можно оставить как есть, но модули, использующие его, должны быть де-кэшированы и повторно импортированы в тестах, где ожидается использование verifySignature. Если поведение должно быть одинаковым для всего набора тестов, это должно быть выполнено также в beforeEach. Например. если эти промежуточные программы используются непосредственно в модуле app, это:

const decache = require('decache');

...

  describe(() => {
    let app;

    beforeEach(() => {
      verifySignatureStub = sinon.stub(signatureMiddleware, 'verifySignature');
      ...
    });

    beforeEach(() => {
      decache('./app');
      app = require('./app');
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...