代码之家  ›  专栏  ›  技术社区  ›  diegoaguilar

将express中间件函数与sinon进行存根

  •  0
  • diegoaguilar  · 技术社区  · 6 年前

    说明

    我尝试为一个express中间件函数设置存根赝品,但这并没有结束。

    我在试着用锡农的存根 callsFake

    即使我需要模块并在导出时替换属性中的函数。我一直看到原来的功能行为。

    我知道我应该在设置中间件函数之前尝试将函数存根,这就是express 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
    

    我已经试过了

    • 设置多个 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上,我用mocha运行测试,用dirty chai做了一个设置。

    "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 回复  |  直到 6 年前
        1
  •  2
  •   Estus Flask    6 年前

    根据经验,每个测试都应设置存根,即 beforeEach it ,不在 before . 在这里,它们似乎不包含每个测试的逻辑,但它们可以,在这种情况下,它们不会像预期的那样工作 . mocha-sinon afterEach 恢复存根时,这是自动完成的。

    verifySignature 是出口财产而不是出口本身, signatureMiddleware 验证签名 . 如果整个测试套件的行为应该相同,那么应该在 也。例如,如果这些中间产品用于 app 模块,它是:

    const decache = require('decache');
    
    ...
    
      describe(() => {
        let app;
    
        beforeEach(() => {
          verifySignatureStub = sinon.stub(signatureMiddleware, 'verifySignature');
          ...
        });
    
        beforeEach(() => {
          decache('./app');
          app = require('./app');
        });