如何为HTTP请求模拟正确使用nock JS固定装置?

时间:2018-08-29 07:03:14

标签: javascript mocking automated-tests nock

我正在尝试记录在执行Stripe的节点库的背景下发生的一些Stripe HTTP调用。

我扎根于nock's back feature,但是尝试以'record'模式执行时却没有最佳结果。

发生了什么事

  • 如果首先使用记录模式运行,则会创建一个夹具文件。这包括3个请求:
    • 对应于库启动以创建客户的对Stripe API的调用。
    • 第二个是调用Stripe API进行订阅创建
    • 第三个是对我们的API端点的攻击,实际上导致了先前的调用被执行。
  • 在第二次以及任何连续执行测试时,对我端点的响应将以空响应结束。

这是与nock的用法有关的代码段:

nockBack.fixtures = path.join(__dirname, 'fixtures')
nockBack.setMode('record')

describe.only('Subscriptions creation', function () {
  this.timeout(20000)

  before(function (done) {
    let {user, jwt} = getRandomUserAndJwt()
    testToken = jwt
    return setupTestDatabaseWithUser(user, async function (err, createdUser) {
      if (err) return done(err)
      testUser = createdUser
      const { nockDone } = await nockBack('subscription.json')
      chai.request(server)
      .post(API_BASE)
      .set('Authorization', `Bearer ${testToken}`)
      .send(testRequestPayload)
      .end(function (err, response) {
        const {status, body: subscription} = response
        status.should.equal(201)
        should.exist(subscription)
        const nyaFields = ['id', 'status', 'planId', 'stripe_status', 'dateSubscriptionWillRenew']
        nyaFields.forEach(f => subscription.should.haveOwnProperty)
        testSubscription = subscription
        nockDone()
        nockBack.setMode('wild')
        done(err)
      })
    })
  })

所以

    const { nockDone } = await nockBack('subscription.json')

导致要创建的文件。我重复一遍,它是一个有3个请求发生的数组。

如果我再次执行,

    .end(function (err, response) {

err将被定义并告知:

{ NetConnectNotAllowedError: Nock: Not allow net connect for "127.0.0.1:63304/api/subscriptions" (...)
  name: 'NetConnectNotAllowedError',
  code: 'ENETUNREACH',
  message: 'Nock: Not allow net connect for "127.0.0.1:63304/api/subscriptions"',
  response: undefined }

所以我尝试添加

  nock.disableNetConnect()
  nock.enableNetConnect(/127\.0\.0\.1/)

在录制之前,还要确保在挂钩结束时,nock设置应如下所示:

    nockDone()
    nockBack.setMode('wild')
    nock.cleanAll()
    nock.enableNetConnect()

但仍然存在相同的问题

0 个答案:

没有答案