【问题标题】:How to test class instance inside a function with Jest如何使用 Jest 在函数内测试类实例
【发布时间】:2018-05-16 22:21:26
【问题描述】:

我有以下假设场景:

// file MyClass.js in an external package
class MyClass {
    myfunc = () => {
        // do something
    }
}

// file in my project
function myFunctionToBeTested() {
    const instance = new MyClass()
    instance.myFunc()
}

我需要使用 Jest 创建一个测试,以确保调用 instance.myFunc

【问题讨论】:

    标签: javascript reactjs unit-testing jestjs


    【解决方案1】:

    其中一个选项是用模拟实现替换 MyClass 模块

    const mockmyfunc = jest.fn()
    jest.mock("path/to/external/package/MyClass", () => {
      return jest.fn().mockImplementation(() => {
        return {myfunc: mockmyfunc}
      })
    })
    

    然后编写如下测试

    it("Test myfunc called in functionToBeTested", () => {
      functionToBeTested()
      expect(mockmyfunc).toHaveBeenCalled()
    })
    

    请注意,这不是唯一的方法,您可以深入了解https://facebook.github.io/jest/docs/en/es6-class-mocks.html 以获得其他选择。

    更新

    如果 myfunc 是一个实际的函数(我猜这不是一个选项,因为它是外部包?)

    export class MyClass {
        myFunc() {
          // do smth
        }
    }
    

    而且你不需要替换实现,你可以使用 jest 的 automock

    import MyClass from "path/to/external/package/MyClass"
    jest.mock("path/to/external/package/MyClass")
    
    it("Test myfunc called in functionToBeTested", () => {
      functionToBeTested()
      const mockMyFunc = MyClass.mock.instances[0].myFunc
      expect(mockMyFunc).toHaveBeenCalled()
    })
    

    【讨论】:

    • 谢谢,"const mockMyFunc = MyClass.mock.instances[0].myFunc" 最佳解决方案!
    【解决方案2】:

    您可以模拟该类并将该文件的默认导出分配给一个变量,如下所示:

    jest.mock('../../utils/api/api');
    const FakeClass = require('../someFile.js').default;
    

    然后像这样访问模拟类上的函数调用:

    FakeClass.prototype.myFunc.mock.calls
    

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 1970-01-01
      • 2020-06-22
      • 2020-11-30
      • 2020-10-29
      • 1970-01-01
      • 2019-04-24
      • 2018-09-27
      • 2019-07-22
      相关资源
      最近更新 更多