使用jest测试一个小demo

126 阅读2分钟

前言

  1. 其实只是一个小demo
  2. js基础
  3. 使用单元测试测试通过率
  4. 源码链接

试题

去除字符串中出现次数最少的字符,不改变原字符串的顺序

    “ababac” ——> “ababa”
    “aaabbbcceeff” ——> “aaabbb”

思考

  • 其实看到这个问题的时候更多的是思考
  • 找规律(如果所有字符串出现次数相同那么就应该保留)
  • 下面是我的思路(欢迎留言分享更好的实现)
  • 算是抛砖引玉了

第一步

首先找出每个字符串出现的次数

// 计算每个字符出现的次数
  const combineKeyLength = str.split('').reduce((target, nextKey) => {
    if (nextKey in target) {
      target[nextKey]++;
    } else {
      target[nextKey] = 1;
    }
    return target;
  }, {});

第二步

开始判断该字符串是不是每个字符都是相同次数

const lengthArr = Object.values(combineKeyLength);

  // 3. 如果每个都只出现相同次数保留原字符串
  if (new Set(lengthArr).size === 1) {
    return str;
  }

第三步

正常情况下实现删除最小出现次数


//存储正则集合
  const regs = []; //存储匹配到的正则表达式 like [/a/g, /c/g, ...]
  
  const selectMinLengthStrValue = Math.min(...lengthArr);

  for (strKey in combineKeyLength) {
    if (combineKeyLength[strKey] == selectMinLengthStrValue) {
      regs.push(new RegExp(`${strKey}`, 'g'));
    }
  }

  return regs.reduce((s, reg) => {
    str = str.replace(reg, '');
    return str;
  }, str);
};

测试

分析

其实更建议每次我们写出一个方法或者其他公共组件时候,需要写一个测试用例,来分析各种可能,那么这次算是一个黑盒形式、代码 -> 测试 另一类开发形如 测试 -> 代码

npm i jest -D

jest --init 

package.json增加scripts脚本

"test": "jest"

写脚本

//新建test.spec.js
const { removeMiniumStr } = require('./util');

const str1 = 'ababac';

const str2 = 'aaabbbcceeff';

const str3 = 'abcdefg';

const str4 = 'aabbccddee';

const str5 = 'aabbcccddee';

describe('test-remove-minimum-str', () => {
  test('str1', () => {
    expect(removeMiniumStr(str1)).toBe('ababa');
  });
  test('str2', () => {
    expect(removeMiniumStr(str2)).toBe('aaabbb');
  });
  test('str3', () => {
    expect(removeMiniumStr(str3)).toBe('abcdefg');
  });
  test('str4', () => {
    expect(removeMiniumStr(str4)).toBe('aabbccddee');
  });
  test('str5', () => {
    expect(removeMiniumStr(str5)).toBe('ccc');
  });
});

执行结果

npm run test

image.png

总结

这是一个基础的小demo,可能会在面试的时候经常遇到,本文更加强调的是当我们编写一个功用方法的时候,应该试着去写一些脚本,当然这种很mini的工具函数,完全可以不用浪费时间,即便这样这是一个思路