Jest单元测试(二)

Jest 使用匹配器

新建 using-matchers.test.js 测试文件

  1. 普通匹配 - toEqual
// using-matchers.test.js

// toBe 使用 Object.is 来测试精确相等
test('two plus two is four', () => {
    expect(2 + 2).toBe(4);
});

// 如果您想要检查对象的值,请使用 toEqual, toEqual 递归检查对象或数组的每个字段。
test('object assignment', () => {
    const data = {one: 1};
    data['two'] = 2;
    expect(data).toEqual({one: 1, two: 2});
});

// not 可以测试相反的匹配︰
test('adding positive numbers is not zero', () => {
    for (let a = 1; a < 10; a++) {
      for (let b = 1; b < 10; b++) {
        expect(a + b).not.toBe(0);
      }
    }
});

  1. Truthiness 匹配

toBeNull 只匹配 null
toBeUndefined 只匹配 undefined
toBeDefined 与 toBeUndefined 相反
toBeTruthy 匹配任何 if 语句为真
toBeFalsy 匹配任何 if 语句为假

例如:

test('null', () => {
    const n = null;
    expect(n).toBeNull();
    expect(n).toBeDefined();
    expect(n).not.toBeUndefined();
    expect(n).not.toBeTruthy();
    expect(n).toBeFalsy();
});
  
test('zero', () => {
    const z = 0;
    expect(z).not.toBeNull();
    expect(z).toBeDefined();
    expect(z).not.toBeUndefined();
    expect(z).not.toBeTruthy();
    expect(z).toBeFalsy();
  });
  1. 数字匹配 - toBe
// 大多数的比较数字有等价的匹配器。
test('two plus two', () => {
  const value = 2 + 2;
  expect(value).toBeGreaterThan(3);
  expect(value).toBeGreaterThanOrEqual(3.5);
  expect(value).toBeLessThan(5);
  expect(value).toBeLessThanOrEqual(4.5);

  // toBe and toEqual are equivalent for numbers
  expect(value).toBe(4);
  expect(value).toEqual(4);
});

// 对于比较浮点数相等,使用 toBeCloseTo 而不是 toEqual,因为你不希望测试取决于一个小小的舍入误差。
test('两个浮点数字相加', () => {
  const value = 0.1 + 0.2;
  //expect(value).toBe(0.3);           这句会报错,因为浮点数有舍入误差
  expect(value).toBeCloseTo(0.3); // 这句可以运行
});


  1. 字符串匹配 - toMatch

您可以检查对具有 toMatch 正则表达式的字符串

test('there is no I in team', () => {
  expect('team').not.toMatch(/I/);
});

test('but there is a "stop" in Christoph', () => {
  expect('Christoph').toMatch(/stop/);
});
  1. 数组匹配 - toContain
    可以通过 toContain 来检查一个数组或可迭代对象是否包含某个特定项
const shoppingList = [
  'diapers',
  'kleenex',
  'trash bags',
  'paper towels',
  'beer',
];

test('the shopping list has beer on it', () => {
  expect(shoppingList).toContain('beer');
  expect(new Set(shoppingList)).toContain('beer');
});

Jest 挂载与卸载函数


// 在所有测试开始之前调用(调用一次)
beforeAll(() => {
  console.log('beforeAll init data ')
});
  
// 在所有测试用例执行完之后调用(一次)
afterAll(() => {
  console.log('afterAll init data ')
});

// 在每个测试用例执行之前调用
beforeEach(() => {
  console.log('beforeEach init data ')
});
// 在每个测试用来执行完之后调用  
afterEach(() => {
  console.log('afterEach clear data ')
});

test('test 1', () => {

});
test('test 2', () => {

});

Jest 测试分组

使用 describe 函数 给测试用例进行分组

describe('普通配置器的案例组', () => {
    // toBe 使用 Object.is 来测试精确相等
    test('two plus two is four', () => {
        expect(2 + 2).toBe(4);
    });
    // 如果您想要检查对象的值,请使用 toEqual, toEqual 递归检查对象或数组的每个字段。
    test('object assignment', () => {
        const data = {one: 1};
        data['two'] = 2;
        expect(data).toEqual({one: 1, two: 2});
    });
    // ....
});

describe('Truthiness匹配器的案例组', () => {
    test('null', () => {
        const n = null;
        expect(n).toBeNull();
        expect(n).toBeDefined();
        expect(n).not.toBeUndefined();
        expect(n).not.toBeTruthy();
        expect(n).toBeFalsy();
    });
    // ...
});

Jest 作用域

// Applies to all tests in this file
beforeEach(() => {
  console.log('在 下面所有的测试用例之前 执行')
});

// toBe 使用 Object.is 来测试精确相等
test('1.two plus two is four', () => {
    expect(2 + 2).toBe(4);
});

// 如果您想要检查对象的值,请使用 toEqual, toEqual 递归检查对象或数组的每个字段。
test('2.object assignment', () => {
    const data = {one: 1};
    data['two'] = 2;
    expect(data).toEqual({one: 1, two: 2});
});
  
describe('Truthiness匹配器的案例组', () => {
  // Applies only to tests in this describe block
  beforeEach(() => {
    console.log('仅仅在 下面这一个测试用例之前 会执行')
  });
  test('3.null', () => {
      const n = null;
      expect(n).toBeNull();
      expect(n).toBeDefined();
  });
});

Jest 模拟函数

编写utils.js

const checkedLogin = (name, password) => {
    if(name === 'admin' && password === '123456'){
      return true
    } else {
      return false
    }
} 
// export default { checkedLogin } // es6 ok
module.exports= {
  checkedLogin
}

编写mock-func.js

import utils from './utils.js'


export const login =(name, password, callback) => {
    if(utils.checkedLogin(name, password)){
      callback('登录成功'); // 编写测试模拟该函数被调用
    } else {
      callback('登录失败'); // 编写测试模拟该函数被调用
    }
}

在 mock-func.test.js 编写单元测试(模拟回调函数如何被调用、调用时的参数和返回值的信息等)


import { login } from './mock-func.js'

describe('login 测试组', () => {

    test('test login1 函数有返回结果', ()=> {
      // 1.模拟登录的回掉函数
      // const mockCallback = jest.fn(res => { // callback 函数接收到的参数
      //     return '登录返回的结果:' + res // callback 函数返回的结果
      // });
      const mockCallback = jest.fn()
        .mockImplementation(res => { // callback 函数接收到的参数
            return '登录返回的结果:' + res // callback 函数返回的结果
        });

      // 2.调用登录函数 
      login('admin', 1234, mockCallback)

      // 3.判断 callback 函数被调用的次数
      expect(mockCallback.mock.calls.length).toBe(1);
      // 4.判断 callback 函数接收到的参数
      expect(mockCallback.mock.calls[0]).toContain('登录失败'); //  ["登录失败"]
      // 5.判断 callback 函数返回的结果
      expect(mockCallback.mock.results[0].value).toBe('登录返回的结果:登录失败');
      // 6.判断 callback 是否被调用
      expect(mockCallback).toHaveBeenCalled();
      // 7.判断 callback 调用时传入的参数是:登录失败
      expect(mockCallback).toHaveBeenCalledWith('登录失败');
    })

    // mock 没有返回值    
    test('test login2 函数没有返回结果', ()=> {
      // 1.模拟登录的回掉函数
      const mockCallback = jest.fn(); // 函数没有返回直接

      // 2.调用登录函数 
      login('admin', 1234, mockCallback)

      // 3.判断 callback 函数被调用的次数
      expect(mockCallback.mock.calls.length).toBe(1);
      // 4.判断 callback 函数接收到的参数
      expect(mockCallback.mock.calls[0]).toContain('登录失败'); //  ["登录失败"]
      // 5.判断 callback 函数没有返回结果
      expect(mockCallback.mock.results[0].value).toBeUndefined()
    })

    // mock 返回值
    test('test login3 自定义函数的返回结果', ()=> {
        // 1.模拟登录的回掉函数
        const mockCallback = jest.fn()
        mockCallback.mockReturnValueOnce('自定义函数的返回结果') // 函数只返回一次
        // mockCallback.mockReturnValue('自定义函数的返回结果') // 函数可被调用多次,返回多次
        
        // 2.调用登录函数 
        login('admin', 1234, mockCallback)
  
        // 3.判断 callback 函数被调用的次数
        expect(mockCallback.mock.calls.length).toBe(1);
        // 4.判断 callback 函数接收到的参数
        expect(mockCallback.mock.calls[0]).toContain('登录失败'); //  ["登录失败"]
        // 5.判断 callback 函数返回的结果
        expect(mockCallback.mock.results[0].value).toBe('自定义函数的返回结果');
    })

})

所有的 mock 函数都有这个特殊的 .mock属性,它保存了关于此函数如何被调用、调用时的返回值的信息。 .mock 属性还追踪每次调用时 this的值,

执行单元测试:yarn test

LiuJun-MacBook-Pro:jest liujun$ yarn test mock-func.js
yarn run v1.13.0
$ jest mock-fu
 PASS  ./mock-func.test.js
  login 测试组
    ✓ test login1 函数有返回结果 (4 ms)
    ✓ test login2 函数没有返回结果
    ✓ test login3 自定义函数的返回结果

Test Suites: 1 passed, 1 total
Tests:       3 passed, 3 total
Snapshots:   0 total
Time:        1.832 s, estimated 2 s
Ran all test suites matching /mock-fu/i.
✨  Done in 3.59s.
LiuJun-MacBook-Pro:jest liujun$ 

在 mock-func.test.js 编写单元测试(模拟 utils 模块,模拟 utils.checkedLogin 函数的实现 )



import { login } from './mock-func.js'

// 1.jest.mock('./utils.js')
let utils = require('./utils.js') // import utils from './utils.js' // ok
// 2.mock 掉 ./utils.js 所有的函数
jest.mock('./utils.js') // 这两个导入顺序没有要求,但是不用再组里面导入

describe('login 测试组', () => {
    // mock 模拟utils模块
    test('test login4 模拟内部的函数(模块)', ()=> {
        // 3.重新实现utils模块对应的函数
        // utils.checkedLogin.mockResolvedValue(true) // ok
        utils.checkedLogin.mockImplementation((name, passwrod )=> {
            if(name === 'admin' && passwrod === '1234'){
                return true
            } else {
                return false
            }
        })

        // 4.模拟登录的回掉函数
        const mockCallback = jest.fn()
        mockCallback.mockReturnValueOnce('自定义函数的返回结果') // 函数只返回一次
        
        // 5.调用登录函数 
        login('admin', '1234', mockCallback)
  
        // 6.判断 callback 函数被调用的次数
        expect(mockCallback.mock.calls.length).toBe(1);
        // 7.判断 callback 函数接收到的参数
        expect(mockCallback.mock.calls[0]).toContain('登录成功'); //  ["登录失败"]
        // 5.判断 callback 函数返回的结果
        expect(mockCallback.mock.results[0].value).toBe('自定义函数的返回结果');
    })

})

执行单元测试:yarn test

LiuJun-MacBook-Pro:jest liujun$ yarn test mock-func.js
yarn run v1.13.0
$ jest mock-fu
 PASS  ./mock-func.test.js
  login 测试组
    ✓ test login1 函数有返回结果 (4 ms)
    ✓ test login2 函数没有返回结果
    ✓ test login3 自定义函数的返回结果
    ✓ test login4 模拟内部的函数(模块) (1 ms)

Test Suites: 1 passed, 1 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        1.832 s, estimated 2 s
Ran all test suites matching /mock-fu/i.
✨  Done in 3.59s.
LiuJun-MacBook-Pro:jest liujun$ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目名称:Java中的简单游戏和应用程序 项目简介: 简单游戏和应用程序是一个Java项目。该项目包含23个不同的Java制作的应用程序和游戏。项目中还包括记事本、拼图等简单应用程序。这是一个单框架程序,你可以选择并运行你希望运行的程序。要运行此项目,你必须在系统上安装JDK路径。 项目简介: 这是一个简单的游戏和应用程序集合,由不同的Java应用程序组成,使该项目独特。你可以选择要运行的程序。如果你想运行记事本,只需在应用程序中点击选项。在记事本中,你可以轻松进行写作,可以处理任何你想要的文本样式。 此外,该项目还包括游戏和测验,例如井字棋和拼图游戏。项目中还提供了字数统计功能。你可以输入任意多的文本,之后可以统计段落中的字数。你还可以玩数独和太空侵略者游戏。不仅如此,你还可以在这个项目中运行不同的应用程序。 项目功能: 记事本:进行文本写作和格式处理。 拼图游戏:挑战你的智力。 井字棋:经典的两人游戏。 字数统计:统计输入文本的字数。 数独:经典的数字填空游戏。 太空侵略者:经典的射击游戏。 其他应用程序和游戏:总计23个不同的程序。 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
Jest 是一个流行的 JavaScript 测试框架,可以用于编写单元测试、集成测试和端到端测试。下面是 Jest 单元测试入门的步骤: 1. 安装 Jest 使用 npm 安装 Jest:`npm install --save-dev jest` 2. 编写测试用例 在项目根目录下创建一个名为 `__tests__` 的文件夹,并在其中创建一个名为 `example.test.js` 的文件。在 `example.test.js` 文件中编写测试用例: ```javascript describe('示例测试', () => { test('测试1', () => { expect(1 + 1).toBe(2); }); test('测试2', () => { expect(true).toBeTruthy(); }); }); ``` 上面的代码定义了一个测试套件 `示例测试`,其中包含两个测试用例 `测试1` 和 `测试2`。每个测试用例都是一个函数,其中包含一个或多个 `expect` 语句,用于断言测试结果是否符合预期。 3. 运行测试 在命令行中输入 `npx jest` 命令,Jest 将自动查找项目中的测试用例并运行它们。如果所有测试用例都通过,Jest 将输出一个绿色的提示。 4. 高级配置 Jest 提供了丰富的配置选项,可以用于定制测试过程。例如,可以在 `package.json` 文件中添加以下配置: ```json { "jest": { "testEnvironment": "node", "testMatch": [ "**/__tests__/**/*.test.js" ], "coverageThreshold": { "global": { "branches": 80, "functions": 80, "lines": 80, "statements": 80 } } } } ``` 上面的配置指定了测试环境为 Node.js,测试文件必须位于 `__tests__` 文件夹中,并以 `.test.js` 结尾。还指定了代码覆盖率的阈值,如果代码覆盖率低于指定的阈值,Jest 将会提示测试失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值