代码之家  ›  专栏  ›  技术社区  ›  darth-coder

Jest throw.finally不是函数

  •  2
  • darth-coder  · 技术社区  · 7 年前

    下面是我的反应组件:

    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 .

    我不知道为什么。感谢您的帮助。 如果您需要更多上下文代码,请告诉我。

    1 回复  |  直到 7 年前
        1
  •  1
  •   darth-coder    7 年前

    我知道了,伙计们!接下来要做的是:

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

    我不知道这是对是错,但它起作用了。如果有更好的方法,请告诉我。