nock неправильно создает мои поддельные запросы - PullRequest
0 голосов
/ 29 ноября 2018

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

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

В тесте для: извлекает каждый идентификатор выпуска отдельно он дважды вызывает nock, но там, где я ожидаю вывода вроде:

[ { id: 123456,
    asset_controller: { id: 54321 },
    display_author: 'Jason',
    author: [ [Object] ] },
  { id: 78902,
    asset_controller: { id: 54321 },
    display_author: 'King',
    author: [ [Object] ] } ]

Вместо этого я получаю 2 точно таких же Джейсона объекта назад.

В тесте на: возвращает ожидаемый результат, содержащий ошибки, когда релиз недоступен , я должен получить массив с ошибкой, но я получаю один Джейсон Возврат объекта.

Мне интересно, перевешивает ли мой beforeEach, где я заглушаю ответ nock, ответы nock в каждом из моих тестов?Удаление ответа nock в beforeEach приводит к ошибкам.

const Releases = require('../../../src/services/Releases');
const authorisation = require('../../../src/services/Authorisation');
const ServiceDiscovery = require('service-discovery');
const Lock = require('../../../src/helpers/Lock');
const http = require('http');

describe('Releases', () => {
  let serviceDiscovery;
  const address = '192.0.0.1';
  const port = 4002;
  const url = 'http://' + address + ':' + port;
  const token = 'abcd';
  beforeEach(() => {
    sinon.stub(authorisation, 'authorise').resolves(
      {
        token: token,
        expiresAt: 12344657547
      }
    );
    authorisation.token = token;
    serviceDiscovery = sinon.createStubInstance(ServiceDiscovery);
    serviceDiscovery.discoverServiceDetails.resolves(
      [
        {
          Address: address,
          ServicePort: port,
        },
      ]
    );

    nock(url, {
      reqheaders: {
        'authorization': 'Bearer ' + token,
        'content-type': 'application/json',
      },
    })
      .post('/graphql')
      .reply(200, {
        data: {
          ReleaseFormat: [
            {
              id: 123456,
              asset_controller: {
                id: 54321,
              },
              display_author: 'Jason',
              author: [
                {
                  id: 123456,
                  name: 'jason',
                },
              ],
            }
          ]
        }
      });
  });
  afterEach(() => {
    authorisation.authorise.restore();
  });
  describe('getReleases', () => {
    it('retrieves each release id individually', async () => {
      const releaseIDs = [123456, 78902];
      const releases = new Releases(authorisation, http, serviceDiscovery, Lock);

      serviceDiscovery.discoverServiceDetails.resolves(
        [
          {
            Address: address,
            ServicePort: port,
            alive: true,
          },
        ]
      );

      nock(url, {
        reqheaders: {
          'Authorization': 'Bearer ' + token,
          'content-type': 'application/json',
        },
      })
        .post('/graphql', JSON.stringify({
          'query': `{
            ReleaseFormat(qbe: {
              id: 123456
              asset_controller: {
                id: 57753805
              }
            })
            {
              id,
              asset_controller {
                id,
                name
              },
              display_author,
              author {
                id,
                name,
                ISNI
              },
            }
          }`
        }))
        .reply(200, {
          data: {
            ReleaseFormat: [
              {
                id: 123456,
                asset_controller: {
                  id: 54321,
                },
                display_author: 'Jason',
                author: [
                  {
                    id: 123456,
                    name: 'jason',
                  },
                ],
              }
            ]
          }
        })
        .post('/graphql', JSON.stringify({
          'query': `{
            ReleaseFormat(qbe: {
              id: 78902
              asset_controller: {
                id: 57753805
              }
            })
            {
              id,
              asset_controller {
                id,
                name
              },
              display_author,
              author {
                id,
                name,
              },
            }
          }`
        }))
        .reply(200, {
          data: {
            ReleaseFormat: [
              {
                id: 78902,
                asset_controller: {
                  id: 54321,
                },
                display_author: 'King',
                author: [
                  {
                    id: 8764567,
                    name: 'king',
                  },
                ],
              }
            ]
          }
        });

      const spy = sinon.spy(releases, '_getReleaseData');
      const actual = await releases.getReleases(releaseIDs);
      console.log(actual);

      expect(spy.called).to.eql(true);
      expect(spy.callCount).to.eql(releaseIDs.length);
      spy.restore();
    });
    it('returns an expected result containing errors when the release is not available', async () => {
      const releaseIDs = [123456];
      const releases = new Releases(authorisation, http, serviceDiscovery, Lock);
      serviceDiscovery.discoverServiceDetails.resolves(
        [
          {
            Address: address,
            ServicePort: port,
            alive: true,
          },
        ]
      );
      nock(url, {
        reqheaders: {
          'authorization': 'Bearer ' + token,
          'content-type': 'application/json',
        },
      })
        .post('/graphql', JSON.stringify({
          'query': `{
            ReleaseFormat(qbe: {
              id: 123456
              asset_controller: {
                id: 57753805
              }
            })
            {
              id,
              asset_controller {
                id,
                name
              },
              display_author,
              author {
                id,
                name,
              },
            }
          }`
        }))
        .reply(200, {
          data: {
            ReleaseFormat: []
          }
        });
      const expected = [
        new Error(`Not a valid release for ID: ${releaseIDs[0]}`)
      ];
      const actual = await releases.getReleases(releaseIDs);
      console.log(actual);
      expect(actual).to.be.an('array');
      expect(actual.length).to.be.eql(expected.length);
      expect(actual.filter(e => e instanceof Error).length).to.be.eql(1);
    });
  });
});
...