JEST throws .finally не является функцией - PullRequest
0 голосов
/ 17 января 2019

Вот мой компонент реакции:

import { sendAnalytics } from 'analytics';

class MyComponent extends React.Component {
    myMethod() {
        console.log('do something!');
    }

    render() {
        return (
            <Button 
                onClick={submitAnalytics({name: 'foo'}).finally(this.myMethod())} 
                dataset={{"data-id": "button"}}
            > Send Analytics
            </Button>
            }
        )
    }
}

И мой тест выглядит так:

import * as analytics from 'analytics';
jest.mock('analytics');

describe('Analytics', () => {
    it('Should call analytics when button is clicked', () => {
        analytics.submitAnalytics.mockResolvedValue(Promise.resolve(true));
        const tree = ReactTestRenderer.create(<MyComponent />);

        // Actual implementation of following 3 lines is slightly different.
        const button = tree.root.findByProps({"data-id": "button"});
        button.props.onClick();
        expect(analytics.submitAnalytics).toHaveBeenCalled();
    });
});

Я пробовал несколько разных стратегий насмешек, таких как:

analytics.submitAnalytics.mockImplementation(() => {
    return Promise.resolve(true)
});

Ничего не получается. Я продолжаю получать следующую ошибку:

TypeError: (0 , analytics.submitAnalytics)(...).finally is not a function.

Не знаю почему. Любая помощь приветствуется. Пожалуйста, дайте мне знать, если вам нужно больше контекстного кода.

Ответы [ 2 ]

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

Импорт @babel/polyfill до теста также решит эту проблему

import '@babel/polyfill';

// Your tests...
0 голосов
/ 17 января 2019

Я понял это, ребята! Вот что нужно было сделать:

analytics.submitPayload = jest.fn().mockImplementation(() => {
  return {
    finally: () => {
      return true;
    }
  };
});

Я не знаю, правильно это или неправильно, но это работает. Пожалуйста, дайте мне знать, если есть лучший способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...