模拟函数笑话但笑话调用原始函数

问题描述 投票:0回答:2

我有一个返回 true 或 false 的函数,我们称之为 myFunc

myFunc (){
  if(something){return true}
  else{return false}
}

这就是它为了 arg 所做的事情

然后我在其他地方调用它

if(myFunc()){

}else{
}

当我注销时,它不断显示为错误。然而,当我在测试中像这样嘲笑它时:

const myMock = (myModule.myFunc = jest.fn())
myMock.mockReturnValue(true)

那么当我从索引文件中记录它时,为什么它仍然返回为 false?或者这不完全是嘲笑的工作方式吗?

javascript reactjs mocking jestjs
2个回答
12
投票

我猜测 myModule 是您导入的对象,然后您在该对象上设置了模拟函数。但是在 myModule 文件中,您直接引用该函数,而不是通过模块引用,对吗?

正确的方法可能是将 myFunc 从 myModule 中移出。但如果你想把它保留在那里,那么你将不得不部分模拟 myModule:

jest.mock('./myModule', () => {
  return {
    ...jest.requireActual('./myModule'),
    myFunc: jest.fn()
  }
})

但请认真考虑将 myFunc 从 myModule 中移出,因为部分模拟既困难又令人困惑。


0
投票

我发现解决问题的一种方法是使用类。

这是一个伪示例:

实施

export class Location {
  getLocation() {
    const environment = this.getEnvironmentVariable();
    return environment === "1" ? "USA" : "GLOBAL";
  }
  getEnvironmentVariable() {
    return process.env.REACT_APP_LOCATION;
  }
}

测试

import { Location } from "./config";

test('location', () => {
  const config = new Location();
  jest.spyOn(config, "getEnvironmentVariable").mockReturnValue("1")

  const location = config.getLocation();
  expect(location).toBe("USA");
});
© www.soinside.com 2019 - 2024. All rights reserved.