zoukankan      html  css  js  c++  java
  • [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',
      }),
    )

  • 相关阅读:
    maven项目启动报错
    maven环境变量配置
    jdk版本升级 eclipse启动失败
    jdk10 环境变量配置
    Invalid bound statement 无效的绑定 的解决办法!
    【Java】-NO.16.EBook.4.Java.1.004-【疯狂Java讲义第3版 李刚】- 内部类
    【Java】-NO.14.Java.4.Java.1.001-【Java JUnit 5 】-
    【Java】-NO.13.Java.1.Foundation.1.001-【Java IO】-
    【设计模式】用追MM来解释23种设计模式,转
    【Linux】-NO.8.Linux.4.Command.1.001-【Common Command】-
  • 原文地址:https://www.cnblogs.com/Answer1215/p/15104858.html
Copyright © 2011-2022 走看看