用 Enzyme 开玩笑,为什么在我的 React 组件测试中没有触发“toHaveBeenCalled”?

巫毒GQ

我正在 React 应用程序中进行单元测试,以验证传入的 prop 函数是否基于另一个 props 值被有条件地调用。我在我的应用程序中使用了 Typescript/Enzyme/Jest,并在Root我正在测试的组件周围使用了一个包装器来注入 Redux 存储(并在需要时覆盖初始状态)。

import { mount, ReactWrapper } from "enzyme";
import React from "react";
import Login from "src/components/auth/Login";
import Root from "src/Root";

let wrapped: ReactWrapper;

let defaultProps = {
  signIn: jest.fn(),
  token: null,
};

beforeEach(() => {
  wrapped = mount(
    <Root>
      <Login {...defaultProps} />
    </Root>
  );
});

describe("on mount", () => {
  describe("if no token is supplied to the props", () => {
    it("will call the props.signIn() function", () => {
      expect(defaultProps.signIn).toHaveBeenCalled();
    });
  });
});

当我运行测试时toHaveBeenCalled()(以及toBeCalled(),都尝试过)没有注册任何呼叫。但是,我提供了一个console.logsignIn()函数存在的相同条件下触发语句

import React from 'react';
import { AuthState, JWT } from "src/components/auth/types";
import { signIn } from "src/redux/auth";

interface Props {
  signIn: () => Promise<void>;
  token: null | JWT;
}

class Login extends React.Component<Props> {
  /**
   * Sign the user in on mount
   */
  public componentDidMount(): void {
    if (!this.props.token) {
      console.log("GETTING HERE");
      this.props.signIn();
    }
  }

  public render(): JSX.Elemeent {
    // ... More code
  }
}

const mapStateToProps = (state: AuthState) => {
  return {
    token: state.auth.token;
  };
};

export default connect(mapStateToProps, { signIn })(Login);

我已经阅读了几篇相关的帖子/文章,但所有不同的配置,例如遍历酶以获得直接道具或利用spyOn,都失败了。

我唯一能想到的不同之处是我用 包裹了Login组件Root,但考虑到我可以看到console.log被触发,这似乎是在黑暗中完成的拍摄。

谁能告诉我我在这里做错了什么?

巫毒GQ

最终是我忘记通过mapDispatchToPropsmapStateToPropsconnect函数中放置覆盖这导致我传入的signIn函数被signIn文件中导入操作覆盖更新ownProps并有条件地利用传入的值解决了这个问题:

const mapStateToProps = (state: AuthState, ownProps: Props) => {
  return {
    token: ownProps.token || state.auth.token;
  };
};

const mapDispatchToProps = (dispatch: ThunkDispatch<{}, {}, any>, ownProps: Props) => {
  return {
    signIn: ownProps.signIn || (() => { return dispatch(signIn()) })
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Login);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么用React测试库无法在测试中执行开玩笑的模拟功能?

用React Native开玩笑

React-Testing:调试,为什么使用Material UI的网格对组件进行的这种开玩笑的快照测试失败

为什么我的React应用程序的Jest / Enzyme setState测试失败?

我如何模拟Enzyme React中的按钮单击?

期望用React的jest,enzyme中的一组值包含文本

在 React Jest/Enzyme 中测试子组件的条件渲染

用Jest和Enzyme响应组件的测试状态

用create-react-app开玩笑-意外的令牌错误

为什么在使用反应片段时没有通过开玩笑测试?

React-用玩笑/酶测试控制器组件

React - Jest/Enzyme 更改触发功能

React / JestJS / Enzyme:如何测试ref函数?

Enzyme 和 React 测试库的区别

使用 react-intersection-observer 开玩笑测试反应组件

如何使用Jest + Enzyme测试React组件的样式?

如何测试输入组件是否为只读,React / Enzyme

使用Jest / Enzyme延迟后意外测试React组件的行为

React、Enzyme:测试状态更新功能组件

使用Enzyme Jest测试React组件以查找HTML元素

开始使用Enzyme和Jest测试React组件

为什么我的输入值没有用React更新?

React&Enzyme:为什么beforeEach()不起作用?

React,Enzyme,Redux单元测试React 16+中的已连接组件

如何通过Jest和Enzyme在React(Native)中为父组件提供功能来测试组件?

如何在React with Enzyme中测试由子组件回调调用的组件回调?

用玩笑和酶在React中测试表单

如何开玩笑地用axios测试异步动作?

用开玩笑的存根函数来测试内部错误