1. 程式人生 > 其它 >[Unit testing + Jest] Use jest-in-case to Reduce Duplication and Improve Test Titles

[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)