javascript - 永远不会调用带有 Jest 的模拟模块函数

标签 javascript jestjs

我有一个非常奇怪的情况,我的 Jest 测试通过了我的 Windows 10 桌面和 Macbook Pro,但它们没有通过我其他 friend 的两个 Windows 10 桌面。
正在测试的代码

import { addTerminalItem } from '../../store'
...
class LoginUser extends EventHandler {
  ...
  async handle () {
    if (this.isFromOauthRedirect) {
      try {
        await this._handleOauthRedirect()
      } catch (e) {
        addTerminalItem(new ErrorMessage(e.message))
      }
      return
    }

    if (await zaClient.isUserLoggedIn('testUserId')) {
      // TODO: user is already logged in, do something
    } else {
      const loginStartSecret = uuidv4()
      localStorage.setItem(LOGIN_START_SECRET, loginStartSecret)
      addTerminalItem(new LoginMessage(loginStartSecret))
    }
  }
  ...
}

export const loginUser = new LoginUser()

测试代码执行以下操作:
  • 添加无效LOGIN_START_SECRET以便实际代码在输入第一个 catch 时引发异常.
  • 为事件 WELCOME_MESSAGE_RENDERED 订阅事件处理程序.
  • mock store.addTerminalItem模块功能。
  • 发布事件所以上面的async handle()功能被触发。
  • 检查是否调用了模拟函数。
  • import * as store from '../../../store'
    ...
    test('different login start secret in localstorage', async () => {
      localStorage.setItem(LOGIN_START_SECRET, 'different-secret')
      zaClient.login = jest.fn(() => true)
      store.addTerminalItem = jest.fn()
    
      await pubsub.publish(WELCOME_MESSAGE_RENDERED)
    
      expect(store.addTerminalItem).toHaveBeenCalledWith(expect.any(ErrorMessage))
      const errorMessage = store.addTerminalItem.mock.calls[0][0]
      expect(errorMessage.message).toBe(loginSecurityErrorMsg)
    })
    
    正如我在我的电脑上所说,它正确显示 addTerminalItem在我家里的两台机器上使用正确的参数调用一次函数。然而,这个模拟函数永远不会在我 friend 的两台机器上被调用并且失败。他们得到的实际错误信息如下:
    expect(jest.fn()).toHaveBeenCalledWith(...expected)
    
    Expected: Any<ErrorMessage>
    
    Number of calls: 0
    
    以下是我们迄今为止尝试过的以下事情:
  • 新鲜 git clone , yarn install , 和 yarn test .我通过了,他们没有。
  • addTerminalItem mock ,我们添加了 console.log里面 addTerminalItem它正确地没有记录,但仍然是 0 次调用。
  • addTerminalItem发现,我们添加了 console.log里面 addTerminalItem它正确记录,但仍然是 0 次调用(这对我来说毫无意义)
  • 我们匹配了我们的 yarn 版本。
  • 我们仔细调试了代码,以确保所有其他事情都按预期工作。

  • 如果有人可以在这里给我们任何指示,将不胜感激。

    最佳答案

    没有手头的代码很难确定,但请尝试使用 jest.mock :

    import {addTerminalItem} from "../../../store";
    
    jest.mock('../../../store', () => ({
      addTerminalItem: jest.fn() 
    ));
    
    //... stuff ...
    
    test('different login start secret in localstorage', async () => {
      localStorage.setItem(LOGIN_START_SECRET, 'different-secret')
      zaClient.login = jest.fn(() => true)
      
      await pubsub.publish(WELCOME_MESSAGE_RENDERED)
    
      expect(addTerminalItem).toHaveBeenCalledWith(expect.any(ErrorMessage))
      const errorMessage = addTerminalItem.mock.calls[0][0]
      expect(errorMessage.message).toBe(loginSecurityErrorMsg)
    })
    

    关于javascript - 永远不会调用带有 Jest 的模拟模块函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62646967/

    相关文章:

    javascript - 在输入旁边对齐 div

    reactjs - 如何测试依赖于 useContext hook 的 React 组件?

    javascript - 如何使用 Jest 和 vue-cli 更新快照

    javascript - react ,开 Jest : simulate submit form unit test

    javascript - AngularJs 数组内部的数组显示在文本区域中

    javascript - 查询 JavaScript 代码的范围

    javascript - 检查具有给定类的元素,未找到情况,将类添加到第一个元素

    javascript - Mongoose 模式不会创建具有给定属性的正确对象

    jestjs - 如何在 Jest 上分离单元和集成/长时间运行的测试?

    javascript - 在 Jest 模拟模块工厂中模拟 promise