【问题标题】:Invalid Chai property: setEncoding on nock无效的 Chai 属性:nock 上的 setEncoding
【发布时间】:2019-08-28 01:50:45
【问题描述】:

我使用nock 9.1.6 来模拟带有chai 3.5.0 的nylas API。它与代码完美配合:

it('fails when no state is given and provider fails', () => {
  const user = fixture.elements.user1;
  const connector = new NylasConnector('nylas', 'connect', user);

  nock(NYLAS_API)
        .post(`/a/${DN_NYLAS_APP_ID}/accounts/${user.nylas.account_id}/downgrade`)
        .reply(500, (uri, body) => expect(body).to.eql(''));

  sinon.stub(Nylas, 'urlForAuthentication').callsFake(params => {
    expect(params).to.eql({
      redirectURI: `${DN_AUTH_SERVICE_URL}/oauth2/nylas/callback`,
      trial: false,
      state: JSON.stringify({})
    });
    return chance.url() + '?' + objectToQuery(params);
  });

  return expect(connector.getAuthenticationUrl()).to.be.rejectedWith(ProviderError)
    .then(() => User.findById(user._id))
    .then(user => {
       expect(user.nylas).not.null;
       expect(user.nylasToken).not.null;
       expect(user.nylasCursor).not.null;
     });
  })

我尝试升级 nock 到 10.0.6 和 chai 到 4.2.0 现在出现以下错误:

"Error: Invalid Chai property: setEncoding",
    "    at Object.proxyGetter [as get] (/home/jeremy/datananas/datananas/packages/api/node_modules/chai/lib/chai/utils/proxify.js:78:17)",
    "    at Object.isStream (/home/jeremy/datananas/datananas/packages/api/node_modules/nock/lib/common.js:382:24)",
    "    at continueWithResponseBody (/home/jeremy/datananas/datananas/packages/api/node_modules/nock/lib/request_overrider.js:435:20)",
    "    at end (/home/jeremy/datananas/datananas/packages/api/node_modules/nock/lib/request_overrider.js:385:12)",
    "    at /home/jeremy/datananas/datananas/packages/api/node_modules/nock/lib/request_overrider.js:160:9",
    "    at OverriddenClientRequest.RequestOverrider.req.write (/home/jeremy/datananas/datananas/packages/api/node_modules/nock/lib/request_overrider.js:139:9)",
    "    at OverriddenClientRequest.RequestOverrider.req.end (/home/jeremy/datananas/datananas/packages/api/node_modules/nock/lib/request_overrider.js:156:11)",
    "    at Request.end (/home/jeremy/datananas/datananas/packages/api/node_modules/request/request.js:1514:14)",
    "    at end (/home/jeremy/datananas/datananas/packages/api/node_modules/request/request.js:564:14)",
    "    at Immediate.<anonymous> (/home/jeremy/datananas/datananas/packages/api/node_modules/request/request.js:578:7)",
    "    at runCallback (timers.js:705:18)",
    "    at tryOnImmediate (timers.js:676:5)",
    "    at processImmediate (timers.js:658:5)"

错误出现在connector.getAuthenticationUrl() 上,因为它是调用模拟函数的函数。在这个函数中,它们是对nylasRequest 的调用,当到达new Promise() 的行时会出现错误:

function nylasRequest(uri, token, body) {
  const params = {
    uri: `https://api.nylas.com${uri}`,
    method: 'POST',
    json: body
  };

  if (token)
    params.auth = { user: token };

  console.log('This line appears. All params are valid.')
  return new Promise((resolve, reject) => request(params, (error, res, body) =>  {
    console.log('This line never shows up');
    // some code
  }));
}

我使用request 2.88.0,并且我没有更改我使用的版本。

【问题讨论】:

    标签: node.js chai nock requestjs


    【解决方案1】:

    我假设您的问题与这一行有关:

    .reply(500, (uri, body) => expect(body).to.eql(''))
    

    Nock 将使用该函数的返回值作为假响应的主体。当 nock 试图确定响应主体是否可流式传输时,从函数返回一个 chai 期望似乎会使 nock 感到困惑。

    我会把它改成这样的:

    nock(NYLAS_API)
      .post(`/a/${DN_NYLAS_APP_ID}/accounts/${user.nylas.account_id}/downgrade`)
      .reply(500, (uri, body) => {
        expect(body).to.eql('')
        return ''
      });
    

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 2019-07-01
      • 2022-08-19
      • 2018-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      相关资源
      最近更新 更多