如何用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
相关产品推荐
相关产品推荐

