JEST抛出.finally不是函数

dar*_*der 7 javascript reactjs jestjs

这是我的react组件:

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>
            }
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

我的测试是这样的:

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();
    });
});
Run Code Online (Sandbox Code Playgroud)

我尝试了几种不同的模拟策略,例如:

analytics.submitAnalytics.mockImplementation(() => {
    return Promise.resolve(true)
});
Run Code Online (Sandbox Code Playgroud)

似乎什么都没有解决。我不断收到以下错误:

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

我不知道为什么 任何帮助表示赞赏。如果您需要其他上下文代码,请告诉我。

Ran*_*lta 6

@babel/polyfill测试前导入也解决了这个问题

import '@babel/polyfill';

// Your tests...
Run Code Online (Sandbox Code Playgroud)


dar*_*der 2

我想通了,伙计们!这是要做的事情:

analytics.submitPayload = jest.fn().mockImplementation(() => {
  return {
    finally: () => {
      return true;
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

我不知道这是对还是错,但它确实有效。如果有更好的方法,请告诉我。