[Unit testing + Jest] Use jest-in-case to Reduce Duplication and Improve Test Titles
Jest has a test-generation feature built-in called test.each which is great, but I don’t particularly like it’s API. Instead, we’re going to use an open source project called jest-in-case which gives us a really nice API for generated tests and improved error messages. Let’s try that library out for our isPasswordAllowed tests here.
// From import {isPasswordAllowed} from '../auth' describe('isPasswordAllowed', () => { const allowedPwds = ['!aBc123'] const disallowedPwds = { 'too short': 'a2c!', 'no alphabet characters': '123456', 'no numbers': 'ABCdef!', 'no uppercase letters': 'abc123!', 'no lowercase letters': 'ABC123!', 'no non-alphanumeric characters': 'ABCdef123', } allowedPwds.forEach((pwd) => { test(`allow ${pwd}`, () => { expect(isPasswordAllowed(pwd)).toBeTruthy() }) }) Object.entries(disallowedPwds).forEach(([key, value]) => { test(`disallow - ${key}: ${value}`, () => { expect(isPasswordAllowed(value)).toBeFalsy() }) }) })
to:
import cases from 'jest-in-case' import {isPasswordAllowed} from '../auth' cases( 'isPasswordAllowed: valid passwords', ({password}) => { expect(isPasswordAllowed(password)).toBe(true) }, { 'valid password': { password: '!aBc123', }, }, ) cases( 'isPasswordAllowed: invalid passwords', ({password}) => { expect(isPasswordAllowed(password)).toBe(false) }, { 'too short': { password: 'a2c!', }, 'no letters': { password: '123456!', }, 'no numbers': { password: 'ABCdef!', }, 'no uppercase letters': { password: 'abc123!', }, 'no lowercase letters': { password: 'ABC123!', }, 'no non-alphanumeric characters': { password: 'ABCdef123', }, }, )
(Not necessary)
Even with jest-in-case there can be a little boilerplate and you can easily side-step that by creating a simple function that allows you to write test cases that are more suited for your use case. Let’s give that a try!
import cases from 'jest-in-case' import {isPasswordAllowed} from '../auth' function casify(obj) { return Object.entries(obj).map(([name, password]) => ({ name: `${password} - ${name}`, password, })) } cases( 'isPasswordAllowed: valid passwords', ({password}) => { expect(isPasswordAllowed(password)).toBe(true) }, casify({'valid password': '!aBc123'}), ) cases( 'isPasswordAllowed: invalid passwords', ({password}) => { expect(isPasswordAllowed(password)).toBe(false) }, casify({ 'too short': 'a2c!', 'no letters': '123456!', 'no numbers': 'ABCdef!', 'no uppercase letters': 'abc123!', 'no lowercase letters': 'ABC123!', 'no non-alphanumeric characters': 'ABCdef123', }), )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-08-05 [AngularJS] Accessible Button Events
2016-08-05 [React Native] Complete the Notes view
2014-08-05 [Javascript] Hositing