【问题标题】:testing a function inside another function using jest使用 jest 在另一个函数中测试一个函数
【发布时间】:2019-06-26 17:13:11
【问题描述】:

我如何使用 jest 测试下面的 sn-p。我正在尝试测试winston自定义格式printf

// sample.js

import {aa:{b}} = require("thirparty-package")

const a = () => {
   return b((log) => {
     return `log message will be ${log.message}`
   })
}

module.exports = {
  a
}


// sample.test.js
const customFunctions = require('./sample')

test('should check b function is called and returns a string', () => {
   expect(customFunctions.a).toHaveBeenCalled() // throwing error 
    //jest.fn() value must be a mock function or spy.
})

【问题讨论】:

  • 目前还不清楚发生了什么。为什么要调用a?你没有打电话。
  • 那我怎么知道 b 会被调用。检查原始的 sn-p 它将为您提供更好的视图 github.com/winstonjs/winston#formats。在这里,如果我们需要一个 customFormat,我们可以给它,但 customFormat 不是一个函数,它只是一个变量。由于我无法对其进行测试,因此我将 customFormat 移出并将其作为函数尝试对其进行测试。但它不起作用

标签: javascript node.js jestjs


【解决方案1】:

如果需要测试的是b,那么它应该是间谍,而不是a

应该模拟第三方模块(demo):

const bMock = jest.fn();
jest.mock('thirparty-package', () => ({ aa: { b: bMock } }));
const { a } = require('./sample');
a();
const callback = bMock.mock.calls[0][0]; 
expect(callback).toEqual(expect.any(Function));
expect(callback({ message: 'foo' })).toBe('log message will be foo');

【讨论】:

  • 我已经用 jest.genMockFromModule('winston'); 模拟了整个 winston 库;
  • 我尝试了代码,但它没有覆盖线,仍然没有覆盖线
  • 我不认为genMockFromModule 会生成嵌套的aa 对象。你可能还需要测试一个回调,比如const cb = bMock.calls[0][1]; expect(cb({ message: ... })).toBe(...)
  • 我不明白你能更新答案sn-p
  • 我已经发布了整个代码,你能检查一下这个stackoverflow.com/questions/54502290/… 并提出解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2014-10-21
  • 2020-02-15
  • 2017-05-13
相关资源
最近更新 更多