Ферментное тестирование, неопределенность,

Я пытаюсь проверить этот метод компонента:

componentWillMount() {
    if (this.props.location.query.customerId) {
      const customer = _.find(this.props.customers.data, ['id', this.state.customerId]);
      this.props.dispatch(getTransactionReceipts(this.props.user, this.state.dateRange));
      this.props.dispatch(setVisibilityFilter({customerId: customer.id,}, 'filter'));
      this.props.dispatch(getCustomers(this.props.user)).then(() => {
        this.props.dispatch(setCustomer(customer));
      });
    }
    else {
      this.loadData(this.props);
      if (this.props.location.query.receiptId) {
        let receiptId = this.props.location.query.receiptId;
        this.props.dispatch(setVisibilityFilter(receiptId));
      }
      else {
        this.props.dispatch(setVisibilityFilter({property: 'type', value: 'All Transactions'}, 'filter'));
      }
    }
  }

но я получаю эту ошибку, когда запускаю тест: TypeError: Cannot read property 'id' of undefined

Я знаю, что это из-за части customer.id, но я не знаю, как издеваться над этим и сделать его доступным для теста.

Вот что у меня есть:

  beforeEach(function () {
    stubs = {};
    stubs.dispatch = sinon.stub();
    stubs.windowOpen = sinon.stub();
    stubs.handleFilterSelection = sinon.stub();
    stubs.handleVoidClose = sinon.stub();
    stubs.processCreditCardVoid = sinon.stub();

    loadDataSpy = sinon.spy(ComponentUnderTest.prototype, 'loadData');

    stubs.dispatch.returns(new Promise(function (resolve, reject) {
      resolve({});
    }));

    componentProperties = _.cloneDeep(mockComponentProperties);
    componentProperties.location = {
      query: {
        customerId: 11111
      }
    };

  });

  afterEach(function () {
    _.invokeMap(stubs, 'restore');
    loadDataSpy.restore();
    mockComponentProperties.dispatch.reset();
  });

  describe('in general', () => {

    beforeEach(function () {
      wrapper = shallow(<ComponentUnderTest {...componentProperties} />);
    });

    it('should render account activity Transactions component', function () {

      expect(wrapper.find('.activityTransactions').length).to.be.ok;

    });

  });
});

Любые указатели на то, как сделать эту информацию доступной для теста?


person Jorge Rodríguez    schedule 28.04.2017    source источник
comment
я думаю, это потому, что у вас нет this.props.customers.data, поэтому ваше задание с const customer = ... не выполняется или совпадение не найдено. вы можете добавить условие перед отправкой действий   -  person Rei Dien    schedule 28.04.2017


Ответы (1)


Где именно определен объект customer? Если он глобальный, просто определите его глобально в своем тесте:

global.customer = {};

В противном случае обычно всегда передавайте данные, используемые в компонентах, через props. поэтому, когда вы используете компонент, просто передайте его:

<Component customerId={customer.id} />

Тогда тестирование будет менее болезненным.

person Joe Duncan    schedule 03.05.2017