Передача параметров в функцию шутки

avatar
The Walrus
8 апреля 2018 в 07:08
18345
1
3

У меня есть эта функция в моем дочернем компоненте:

<div> {handTotal('dealersHand').total} </div>

Это было передано свыше

однако, когда я запускаю шутку, он говорит Cannot read property 'total' of undefined

когда я console.log(handTotal('dealersHand') он регистрирует правильные вещи, и функция работает, поэтому я знаю, что она делает правильные вещи

Я в шутку затушил это так:

const handTotalStub = jest.fn()
  beforeEach(() => {
    wrapper = mount(<Dealer
      dealersHand={dealersHandStub}
      containsAce={containsAceStub}
      handTotal={handTotalStub}
    />);
  })

Как мне передать параметр в эту функцию, чтобы jest понял, что это такое?

можно добавить дополнительный код/объяснение, если это не имеет смысла

заглушка:

  const handTotalStub = jest.fn().mockReturnValue('dealersHand')

тест:

  it('expects dealers hand to equal', () => {
    expect(handTotalStub('dealersHand').total).toEqual(1);
  });
Источник

Ответы (1)

avatar
Jason Spradlin
8 апреля 2018 в 07:15
3

Ваша шпионская шутка для handleTotalStub ничего не возвращает, поэтому она возвращает undefined. Когда ваш компонент пытается вызвать handTotal('dealersHand').total, он вызывает undefined.total, поскольку handTotal(...) не определен.

Обновите своего шпиона, чтобы вернуть что-нибудь (что угодно), изменив

handTotalStub = jest.fn();

до

handTotalStub = jest.fn().mockReturnValue(SOME_VALUE);

или

handTotalStub = jest.fn().mockImplementation(() => SOME_VALUE);

(где SOME_VALUE — это любое значение, которое вы можете смоделировать, чтобы оно действовало как ожидаемое компонентом)

РЕДАКТИРОВАТЬ -- Итак, вы неправильно понимаете, что делает mockReturnValue. Вам не нужно имитировать параметры, передаваемые этому методу. Потому что ваш компонент уже передает эту строку. НО, фактический метод handTotal никогда не будет вызываться (это хорошо, потому что мы не тестируем, как работает handTotal, мы тестируем, как работает компонент).

Итак, все, что handTotal обычно возвращает, это то, что вы хотите поместить в mockReturnValue(). Таким образом, если handTotal возвращает объект типа {total: 1}, вы должны сказать mockReturnValue({total: 1})

.
The Walrus
8 апреля 2018 в 07:22
0

хорошо, но я сделал это, и теперь он думает, что вся функция не определена или, скорее, expected: 1, received: undefined?

Jason Spradlin
8 апреля 2018 в 07:30
0

Вам нужно опубликовать фактический тест. Я не вижу, где вы говорите expect(...)...

Jason Spradlin
8 апреля 2018 в 07:37
0

Извините, также обновите, как вы создали заглушку (что она возвращает??)

The Walrus
8 апреля 2018 в 07:40
0

добавил и это.

The Walrus
8 апреля 2018 в 07:45
0

ах, хорошо, хорошо, но с точки зрения фактического тестирования этой функции, должен ли я сделать это в компоненте выше, где он определен?

Jason Spradlin
8 апреля 2018 в 07:47
0

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