Jest: 模拟静态类方法

创建于 2016-07-05  ·  3评论  ·  资料来源: facebook/jest

我在尝试在 Jest 中模拟静态类方法时遇到了问题。 是否支持这种行为?

交叉发布在http://stackoverflow.com/questions/38206478/mocking-methods-in-jest

我有一个非常简单的单元测试,如下所示:

import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')

describe('Helper', () => {
    let Helper;

    beforeEach(() => {
        Helper = require('../helper').default;
    });

    it('calls the Api Wrapper', () => {
        Helper.help()

        expect(ApiWrapper.help).toHaveBeenCalled();
    });

});

Helper 看起来像这样:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

ApiWrapper 看起来像这样:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help() 被 Jest 嘲笑所以“帮助!” 永远不会被打印,但测试中的期望失败。 如果我们将 ApiWrapper 重写为像这样的普通 Javascript 对象,这仍然会失败:

export default {
    help: () => { console.log('help!'); }
}

但是,如果我们更改规范中的导入(因此 ApiWrapper 在 beforeEach 中导入),并且将 ApiWrapper 重写为单例类,它会起作用,如下所示:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

是什么让 Jest 的嘲笑行为导致了这种情况?

最有用的评论

Jest 会在每次调用it重置模块注册表。 您需要顶部的ApiWrapper和 beforeEach 内部的Helper ,因此 Helper 可能会收到ApiWrapper的不同副本。 要修复它,您可以:

  • 在顶部导入两个类。
  • 需要beforeEach两个类

简化说明:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

如果这不能解决您的问题,请告诉我。

所有3条评论

正确的断言应该是toBeCalled 。 你可以试试吗?

对不起,这就是我的意思。 我直接在 Stackoverflow 中输入了示例。

Jest 会在每次调用it重置模块注册表。 您需要顶部的ApiWrapper和 beforeEach 内部的Helper ,因此 Helper 可能会收到ApiWrapper的不同副本。 要修复它,您可以:

  • 在顶部导入两个类。
  • 需要beforeEach两个类

简化说明:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

如果这不能解决您的问题,请告诉我。

此页面是否有帮助?
0 / 5 - 0 等级