【问题标题】:jest mock file's variables and change function behaviour开玩笑模拟文件的变量并更改函数行为
【发布时间】:2019-03-21 07:38:47
【问题描述】:

我想为我的路由器编写测试用例。我有我想在测试用例期间模拟的 const 对象。如何更改测试文件中的用户对象。

const user = {
  isAuthenticated: true
};

export const PrivateRoute = ({ component: Component, ...rest }) => {
  return (
    <Route
      {...rest}
      render={props =>
        user.isAuthenticated ? (
          <Component {...props} />
        ) : (
          <Redirect
            to={{
              pathname: "/login",
              state: { from: props.location }
            }}
          />
        )
      }
    />
  );
};

test.js

it("should return login route", () => {
    const route = <PrivateRoute path="/" component={()=>{}} />
    expect(route)..toMatchSnapshot();
});

it("should return home route", () => {
    const route = <PrivateRoute path="/" component={()=>{}} />
    expect(route)..toMatchSnapshot();
});

【问题讨论】:

  • 如果不导出user,则不能。目前尚不清楚为什么它必须是其他任何地方都无法访问的常量。
  • @estus: const user 仅用于此文件,这就是为什么我将其放入此文件本身的原因。即使我导出用户,我怎样才能让测试用例使用导出的用户?
  • 这个模块内的用户是否也改变了?使用常量来存储全局状态不是一个好习惯,尤其是因为这会使测试变得更加复杂。

标签: reactjs jestjs


【解决方案1】:

user 应该在模块外部可用以用于可测试性目的:

export const user = {
  isAuthenticated: true
};

这样就可以在测试中模拟了

user.isAuthenticated = false;

应保留原始值以免交叉污染测试:

let originalIsAuthenticated;

beforeEach(() => {
  originalIsAuthenticated = user.isAuthenticated;
});

afterEach(() => {
  user.isAuthenticated = originalIsAuthenticated;
});

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 2020-07-21
    • 2021-11-20
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多