You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jest测试SlugGeneratorAdapter是否正确调用slugify函数

问题:Jest无法验证slugify是否被正确调用

我编写了SlugGeneratorAdapter类,它的gerar方法会调用slugify函数,但用Jest编写的测试始终失败,无法验证slugify是否被传入正确参数调用,推测原因是slugify未被检测到调用。

测试代码

import { SlugGeneratorAdapter } from './slug-generator-adapter'
import slugify from 'slugify'

describe('SlugGenerator Adapter', () => {
  test('Deve chamar slug generator com os parâmetros corretos. ', () => {
    const target = new SlugGeneratorAdapter()

    const slugifySpy = jest.fn(slugify)

    target.gerar('any text')
    expect(slugifySpy).toHaveBeenCalledWith('any text')
  }

  )
})

适配器类代码

import slugify from 'slugify'
import { SlugGenerator } from '../../data/protocols/slug-generator'

export class SlugGeneratorAdapter implements SlugGenerator {
  gerar (param: string): string {
    slugify(param)
    return 'any_value'
  }
}

补充说明

slugify是一个将字符串转换为短横线分隔格式的工具函数,示例:

import slugify from 'slugify'

slugify('any text more text') // 返回 any-text-more-text

解决方案

测试失败的核心原因是:你创建的slugifySpy只是包装了slugify的新函数,但适配器类内部调用的是原始的slugify,并非你定义的这个spy。Jest不会自动替换模块中的原始导出,必须手动mock整个slugify模块。

修改后的测试代码

import { SlugGeneratorAdapter } from './slug-generator-adapter'
import slugify from 'slugify'

// Mock整个slugify模块,将其替换为Jest mock函数
jest.mock('slugify', () => jest.fn())

describe('SlugGenerator Adapter', () => {
  test('Deve chamar slug generator com os parâmetros corretos. ', () => {
    const target = new SlugGeneratorAdapter()

    target.gerar('any text')
    
    // 直接断言mock后的slugify被正确调用
    expect(slugify).toHaveBeenCalledWith('any text')
  })
})

可选:保留原始功能同时监控调用

如果需要保留slugify的原始转换逻辑,同时监控它的调用情况,可以这样写:

import { SlugGeneratorAdapter } from './slug-generator-adapter'
import slugify from 'slugify'

// Mock模块但保留原始函数的功能
jest.mock('slugify', () => ({
  __esModule: true,
  default: jest.fn(require('slugify').default)
}))

describe('SlugGenerator Adapter', () => {
  test('Deve chamar slug generator com os parâmetros corretos. ', () => {
    const target = new SlugGeneratorAdapter()

    const result = target.gerar('any text')
    
    expect(slugify).toHaveBeenCalledWith('any text')
    // 也可以验证返回值是否符合原始函数的输出
    expect(result).toBe('any-text')
  })
})

内容的提问来源于stack exchange,提问作者Diego Alves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:33:34