繁体   English   中英

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

[英]how to test abstracted functions in javascript using jest?

我有如下定义的2个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.spyOn 将对象的function属性替换为spy

jest.spyOn(fn, 'b')将用间谍替换对象fnb属性。

fn.a()调用A ,后者直接调用B ,它不调用fn.b因此从不调用间谍。

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

创建间谍时, 对象通常是module

这就是为什么监视导出函数非常容易而监视非导出函数非常困难的原因,这引出了重要的一点: 如果一个函数在同一模块中调用非导出函数,那么它只是实现细节,在模块外部不可见,并且使用黑匣子测试方法无需测试。

如果您发现B比实现细节更多,你想刺探或存根其功能那么最简单的方法(尤其是这段代码的出口是创建每次被调用时将一个新的对象的函数)是将B放入自己的模块中:


行动,beta.js

import { B } from './lib';

export function A () {
  B()
}

export function API (){
  return {
    a: A,
    b: B
  }
}

lib.js

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

考试:

import { API } from './actions-beta'
import * as lib from './lib';   // import the module with B

describe('test A', () => {
  test('', () => {
    const fn = API()
    console.log(fn)
    const spy = jest.spyOn(lib, 'B')   // spy on B using its module
    fn.a()
    expect(spy).toHaveBeenCalled()   // SUCCESS
  })
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM