【问题标题】:Jest mock submodule functionJest 模拟子模块功能
【发布时间】:2019-07-16 17:47:19
【问题描述】:

我有一个名为client 的节点模块。它的结构如下:

//index.js
import users from "./users"

export default { users }

还有:

//users.js
export default { getUser }
function getUser(username) {
    ...
    return {role: userRole}  
}

我想在我的测试中模拟这个 getUser(username) 函数。 所以我可以这样称呼:

client.users.getUser.mockResolvedValueOnce({role: "manager"}) 

我的测试头是这样的:

let client = jest.genMockFromModule('client').default;
client.users.getUser = jest.fn();

但是,在运行我的测试时,当我的原始代码调用 client.users.getUser 时出现以下错误。

TypeError: Cannot read property 'users' of undefined

  58 | 
  59 |     // Retrieve user and then return its projects
> 60 |     client.users.getUser(username)
     |                  ^
  61 |         .then(user => {
  62 |             if (!user) {
  63 |                 throw new Error(`User ${username} not found`)

  at Object.getUser (node_modules/client/build/users.js:26:45)
  at Object.getUser [as insert] (src/web/controller/projects.js:60:18)
  at Object.insert (src/web/controller/projects.test.js:80:18)

【问题讨论】:

    标签: node.js express testing mocking jestjs


    【解决方案1】:

    你可以像这样模拟//users.js 模块:

    jest.mock('./users.js', () => ({getUser: () => ({role: "manager"})})) //note that the path is relative to the test
    

    如果您在测试期间需要不同的返回值,您可以模拟它以返回一个间谍并在测试中设置模拟返回值:

    import {getUsers} from './users'
    jest.mock('./users.js', () => ({getUser: jest.fn()})) 
    
    it('does something', () => {
     getUser.mockImplementation(() => ({role: "manager"}))
    })
    it('does something else', () => {
     getUser.mockImplementation(() => ({role: "user"}))
    })
    

    【讨论】:

    • 但我不认为我可以这样嘲笑用户。因为我正在测试另一个模块:项目。 (谢谢!)
    • 没关系。您可以模拟每个模块,并将被模拟所取代。
    • 我在这里尝试: import {getUsers} from 'client/users' jest.mock('client/users.js', () => ({getUser: jest.fn()} )) 但我得到:无法从“projects.test.js”中找到模块“client/users.js”
    • 貌似路径不对,一般是相对路径以./开头
    • 我已经让它工作了:jest.mock('client', () => ({ users: { getUser: jest.fn() } }));并且: test.only("block manager role", done => { clients.users.getUser.mockImplementation(() => { return Promise.resolve({role: "manager"}) }) 还有另一种方法而不是模拟完整模块(如您所建议的)?我想说的是:这个相对路径不起作用。可能因为是外部模块而不起作用。
    猜你喜欢
    • 2019-08-28
    • 2021-06-27
    • 2018-01-18
    • 2019-08-17
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多