Недопустимое свойство Chai: setEncoding на nock - PullRequest
1 голос
/ 06 апреля 2019

Я использовал nock 9.1.6, чтобы высмеивать API Nylas с chai 3.5.0. Он отлично работал с кодом:

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, и я не изменил версию, которую я использую.

1 Ответ

0 голосов
/ 27 мая 2019

Я предполагаю, что ваша проблема с этой строкой:

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

Нок будет использовать возвращаемое значение из этой функции в качестве тела поддельного ответа. Возврат ожидания функции 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 ''
  });
...