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',
      }),
    )

  • 相关阅读:
    6大开源SIEM工具,安全信息和事件管理的“利器”
    数据库为何需要安全审计系统
    WEB漏洞扫描的开源工具
    12种开源Web安全扫描程序
    开源框架openresty+nginx 实现web应用防火墙(WAF)
    锦衣盾:开源WEB应用防火墙介绍
    20步打造最安全的Nginx Web服务器
    MySQL数据库审计系统
    数据库(分库分表)中间件对比
    Mysql调优基础、Mysql问题排查、Mysql优化、与hikari数据库连接池配合
  • 原文地址:https://www.cnblogs.com/Answer1215/p/15104858.html
Copyright © 2011-2022 走看看