Невозможно прочитать свойство неопределенного сгенерированного из запущенных NPM и PACT - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь следовать примеру семинара PACT с некоторыми альтернативными данными.

Это может быть больше вопросом Javascript / Node, но я как тупик, как новичок.

Имеется файл customer.spec.js:

const chai = require('chai');
const nock = require('nock');
const chaiAsPromised = require('chai-as-promised');
const expect = chai.expect;
const API_PORT = process.env.API_PORT || 9123;
chai.use(chaiAsPromised);

const API_HOST = `http://localhost:${API_PORT}`;

describe('Consumer', () => {
  describe('when a call to the Provider is made', () => {
    const clothingStatus = 'hello';
    const {emailClothingOfferStatus} = require('../client');

    it('can process the HTML payload from the provider', () => {
      nock(API_HOST)
        .get('/provider')
        .query({validPermStatus:'hello'})
        .reply(200, {
          test:'NO',
          validPermStatus: clothingStatus,
          count: 1000,
        });

      const response = emailClothingOfferStatus(clothingStatus);

      return expect(response.body.clothingStatus).to.eventually.equal('hello')
    })
  })
});

и файл .js клиента:

const request = require('superagent');
const API_HOST = process.env.API_HOST || 'http://localhost';
const API_PORT = process.env.API_PORT || 9123;
const API_ENDPOINT = `${API_HOST}:${API_PORT}`;

// Fetch provider data
const emailClothingOfferStatus = emailPermChoice => {
  let withEmailClothing = {};
  const emailClothingGrantedRegex = 'hello';

  if(emailPermChoice){
    console.log(emailPermChoice);
    withEmailClothing = {validPermStatus: emailPermChoice}
  }

  return request
    .get(`${API_ENDPOINT}/provider`)
    .query(withEmailClothing)
    .then(
      res => {
        if (res.body.validPermStatus.match(emailClothingGrantedRegex)) {
          return {
            clothingStatus: (res.body.validPermStatus),
          }
        } else {
          throw new Error('Could not verify email clothing offer status')
        }
      },
      err => {
        throw new Error(`Error from response: ${err.body}`)
      }
    )
};

module.exports = {
  emailClothingOfferStatus,
};

, и в моем пакете есть следующееСкрипты .json:

"test:consumer": "./node_modules/.bin/mocha --timeout 150000 pact/consumer/test/consumer.spec.js",

Когда я запускаю npm run test: consumer, я получаю:

1) Consumer
       when a call to the Provider is made
         can process the HTML payload from the provider:
     TypeError: Cannot read property 'clothingStatus' of undefined
      at Context.it (pact/consumer/test/consumer.spec.js:29:35)

Я уверен, что это что-то очевидное, но кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

В качестве проблемы мне выделяются две вещи:

  1. Приведенный выше тест является обычным модульным тестом , предназначенным для демонстрации того, как модульные тесты не уловят проблем с контрактом, иприводит вас к пониманию того, почему Pact полезен (в случае, если это неясно).Короче говоря, это вовсе не тест Pact - я могу сказать, потому что он использует Nock, то есть ожидаемые запросы никогда не достигнут Pact.Я также могу сказать, потому что пакет Pact не импортируется.Вы хотите смоделировать из этого файла https://github.com/DiUS/pact-workshop-js/blob/master/consumer/test/consumerPact.spec.js
  2. Значение response является Обещанием, что означает, что вы не можете выполнить return expect(response.body.clothingStatus).to.eventually.equal('hello'), потому что ответом является обещание, поэтому body будет undefinedи clothingStatus не является собственностью этого.API chai со временем полезен для такого рода тестов, но, как я понимаю, он должен работать напрямую с Promise - вы можете выполнить expect(response).to..., и тогда chai может приступить к работе.
0 голосов
/ 27 ноября 2018

Ваша функция emailClothingOfferStatus возвращает response.then(), что является обещанием, а не фактическим ответом.

Поэтому response.body равно undefined.

Вы должны быть в состоянии проверить результат следующим образом:

const response = emailClothingOfferStatus(clothingStatus);
response.then((res) => {
  expect(res.body.clothingStatus).to.eventually.equal('hello')
})
...