【问题标题】:Jest - mock individual function from es6 classJest - 模拟 es6 类中的单个函数
【发布时间】:2018-04-04 13:33:34
【问题描述】:

我想测试是否从我正在测试的函数中调用了特定函数,但是这两个函数都在我正在测试的 es6 类中。

设置:

// MyClass.js

export default class MyClass {
   constructor () { ... }
   foo() {
      ...
      bar()
   }
   bar() { 
      ... 
   }
}

所以我正在测试 foo() 但作为测试的一部分,我想确保调用 bar()。如果 bar() 是一个外部依赖项,我可以看到如何做到这一点,因为我可以模拟它,但由于它是我正在测试的类的一部分,我不能模拟整个类,否则我不会调用具体的实现在我的测试中。

我希望这可以解决问题(根据 https://facebook.github.io/jest/docs/en/es6-class-mocks.html)但无济于事:

// MyClass.spec.js

jest.unmock('./MyClass')
import MyClass from './MyClass'  
...
test('my test', () => {
   var mockBar = jest.fn()
   MyClass.bar = mockBar   

   var myClass = new MyClass()
   myClass.foo()

   expect(mockBar).toHaveBeenCalled()
})

我还尝试在 MyClass 的实例化版本(即 myClass.bar = mockBar)上模拟该方法,但都没有给出预期的结果。

这种模拟结构可以用 jest 来实现吗?

【问题讨论】:

    标签: unit-testing jestjs es6-class


    【解决方案1】:

    在测试 ES6 类的特定方法(不是类实例)时,你应该模拟的不是类的属性,而是这个类的属性prototype

    jest.unmock('./MyClass')
    import MyClass from './MyClass'  
    ...
    test('my test', () => {
      var mockBar = jest.fn()
      MyClass.prototype.bar = mockBar // here's the difference   
    
      var myClass = new MyClass()
      myClass.foo()
    
      expect(mockBar).toHaveBeenCalled()
    })
    

    这是因为 ES6 类只是普通 Javascript 原型模型的糖,而且

    class MyClass {
      bar() {}
    }
    

    等价于不

    var MyClass = function () {
      MyClass.bar = function bar() {};
    
      return MyClass;
    }();
    

    但要

    var MyClass = function () {
      MyClass.prototype.bar = function bar() {};
    
      return MyClass;
    }();
    

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 2016-04-09
      • 2018-05-04
      • 1970-01-01
      • 2017-09-30
      • 2019-03-22
      • 1970-01-01
      • 2018-09-14
      • 2019-10-19
      相关资源
      最近更新 更多