【问题标题】:Jest: How to consume result of jest.genMockFromModule玩笑:如何使用 jest.genMockFromModule 的结果
【发布时间】:2017-08-05 11:23:16
【问题描述】:

我正在尝试模拟 firebase 模块

在我的__mocks__/firebase.js 文件中我简单地放了

const mockFirebase = jest.genMockFromModule('firebase');
export default mockFirebase;

如果我这样做,在我的代码中

import * as firebase from 'firebase';
console.log(firebase);

我明白了

{ default:
  {
    __esModule: true,
    initializeApp:
    { [Function: initializeApp]
      _isMockFunction: true,
      getMockImplementation: [Function],
      mock: [Getter/Setter],
      mockClear: [Function],
      mockReset: [Function],
      mockReturnValueOnce: [Function],
      mockReturnValue: [Function],
      mockImplementationOnce: [Function],
      mockImplementation: [Function],
      mockReturnThis: [Function],
      mockRestore: [Function] },
    app:
    { [Function: app]
      _isMockFunction: true,
      getMockImplementation: [Function],
      mock: [Getter/Setter],
      mockClear: [Function],
      mockReset: [Function],
      mockReturnValueOnce: [Function],
      mockReturnValue: [Function],
      mockImplementationOnce: [Function],
      mockImplementation: [Function],
      mockReturnThis: [Function],
      mockRestore: [Function],
      App: [Object] },
    apps: [],
    Promise:
    { [Function: Promise]
      _isMockFunction: true,
      getMockImplementation: [Function],
      mock: [Getter/Setter],
      mockClear: [Function],
      mockReset: [Function],
      mockReturnValueOnce: [Function],
      mockReturnValue: [Function],
      mockImplementationOnce: [Function],
      mockImplementation: [Function],
      mockReturnThis: [Function],
      mockRestore: [Function],
      _37: null,
      _87: null,
      _61: [Object],
      resolve: [Object],
      all: [Object],
      reject: [Object],
      race: [Object],
      denodeify: [Object],
      nodeify: [Object],
      enableSynchronous: [Object],
      disableSynchronous: [Object] },
    SDK_VERSION: '4.2.0',
    INTERNAL:
    { registerService: [Object],
      createFirebaseNamespace: [Object],
      extendNamespace: [Object],
      createSubscribe: [Object],
      ErrorFactory: [Object],
      removeApp: [Object],
      factories: [Object],
      useAsService: [Object],
      deepExtend: [Object],
      node: [Object],
      Promise: [Object] },
    auth:
    { [Function: serviceNamespace]
      _isMockFunction: true,
      getMockImplementation: [Function],
      mock: [Getter/Setter],
      mockClear: [Function],
      mockReset: [Function],
      mockReturnValueOnce: [Function],
      mockReturnValue: [Function],
      mockImplementationOnce: [Function],
      mockImplementation: [Function],
      mockReturnThis: [Function],
      mockRestore: [Function],
      Auth: [Object],
      Error: [Object],
      EmailAuthProvider: [Object],
      FacebookAuthProvider: [Object],
      GithubAuthProvider: [Object],
      GoogleAuthProvider: [Object],
      TwitterAuthProvider: [Object],
      OAuthProvider: [Object],
      PhoneAuthProvider: [Object],
      RecaptchaVerifier: [Object] },
    User:
    { [Function: S]
      _isMockFunction: true,
      getMockImplementation: [Function],
      mock: [Getter/Setter],
      mockClear: [Function],
      mockReset: [Function],
      mockReturnValueOnce: [Function],
      mockReturnValue: [Function],
      mockImplementationOnce: [Function],
      mockImplementation: [Function],
      mockReturnThis: [Function],
      mockRestore: [Function],
      Cg: [Object],
      Sc: [Object] },
    database:
    { [Function: serviceNamespace]
      _isMockFunction: true,
      getMockImplementation: [Function],
      mock: [Getter/Setter],
      mockClear: [Function],
      mockReset: [Function],
      mockReturnValueOnce: [Function],
      mockReturnValue: [Function],
      mockImplementationOnce: [Function],
      mockImplementation: [Function],
      mockReturnThis: [Function],
      mockRestore: [Function],
      Reference: [Object],
      Query: [Object],
      Database: [Object],
      enableLogging: [Object],
      INTERNAL: [Object],
      ServerValue: [Object],
      TEST_ACCESS: [Object] },
    default: [Circular]
  } 
}

由此我了解到我正在按预期模拟模块。

我有类似
contactKey = firebase.database().ref().child(path).push().key;

的代码

我的测试失败并出现以下错误:

TypeError: firebase.database is not a function

如果我这样做 console.log(firebase.default.database) 我会得到

function serviceNamespace() {return mockConstructor.apply(this,arguments);}

如果我这样做console.log(firebase.default.database()) 我会得到

undefined

我应该如何使用这个模拟? console.log 的输出使它看起来像生成的模拟是我所期望的(或多或少),但没有什么是可调用的。

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案1】:

    在您的mock 中尝试类似的操作 -

    const push = jest.fn(() => ({ key: 'mockContactKey' }));
    
    const child = jest.fn(() => ({ push }));
    
    const ref = jest.fn(() => ({ child }));
    
    mockFirebase.database = jest.fn(() => ({ ref }));
    

    这就是您的contactKey 获得mockContactKey 所需要的一切

    【讨论】:

    • 感谢您继续尝试和帮助。我知道我可以自己手动模拟所有功能,但我有兴趣尽可能地利用 jest.genMockFromModule。为什么我不能访问生成的模拟对象的数据库属性?
    【解决方案2】:

    您只需要获取从genMockFromModule 返回的默认值。

    const mockFirebase = jest.genMockFromModule('firebase').default;
    export default mockFirebase;
    

    documentation 很好地解释了这一点。

    【讨论】:

      【解决方案3】:

      我认为您需要先访问prototype,如下所示:

      firebase.prototype.database()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 2021-01-06
        • 2020-02-08
        相关资源
        最近更新 更多