Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jest测试javascript中的抽象函数?_Javascript_Unit Testing_Jestjs - Fatal编程技术网

如何使用jest测试javascript中的抽象函数?

如何使用jest测试javascript中的抽象函数?,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,我有两个javascript A和B函数,定义如下,并通过另一个名为API的函数公开,如下所示,我想测试函数A,看看它是否在调用B function A () { B() } function B () { console.log('B is called') } export function API (){ return { a: A, b: B } } 我尝试测试功能的方式如下所示,但这些功能不起作用 import { API } from './ac

我有两个javascript A和B函数,定义如下,并通过另一个名为API的函数公开,如下所示,我想测试函数A,看看它是否在调用B

function A () {
  B()
}

function B () {
  console.log('B is called')
}

export function API (){
  return {
    a: A,
    b: B
  }
}
我尝试测试功能的方式如下所示,但这些功能不起作用

import { API } from './actions-beta'

describe('test A', () => {
  test('', () => {
    const fn = API()
    console.log(fn)
    const spy = jest.spyOn(fn, 'b')
    fn.a()
    expect(spy).toHaveBeenCalled()
  })
})

没有办法测试B是否以编写代码的方式调用

细节 开玩笑,间谍

jest.spyOnfn,“b”将用间谍替换对象fn上的b属性

fn.a调用a,而a直接调用B,它不调用fn.B,因此从不调用间谍

解决方案 A需要使用对象属性调用B,该属性可以在测试期间替换为间谍

创建间谍时,对象通常是模块

这就是为什么监视导出函数非常容易,监视非导出函数非常困难的原因,这就引出了一个重要的问题:如果一个函数在同一个模块内调用了一个未导出的函数,那么它只是一个在模块外不可见的实现细节,并且使用黑盒测试方法,它不需要进行测试

如果您发现B不仅仅是一个实现细节,并且您希望监视或存根它的功能,那么最简单的方法就是将B移动到它自己的模块中,特别是对于此代码,其中导出是一个每次调用它时都会创建一个新对象的函数:

actions-beta.js

从'./lib'导入{B}; 导出函数A{ B } 导出函数API{ 返回{ a:a, b:b } } lib.js

导出功能B{ 控制台。调用日志“B” } 测试:

从“/actions beta”导入{API} 从“/lib”导入*作为库;//使用B导入模块 描述“测试A”,=>{ 测试,=>{ 常数fn=API console.logfn const spy=jest.spyOnlib,'B'//使用其模块监视B fn.a expectspy.to已被调用//成功 } }