前端测试框架jest - 基于 vue 的快速入门

导语

我这边尽量一步一步介绍

jest 介绍

jest 是一个 javaScript 测试框架, 目的在确保任何 javaScript 代码的正确性。
大概有下面这些特性

  • 零配置 — jest 的目标是在大部分 javaScript 项目上实现开箱即用, 无需配置
  • 快照 — 能够追踪大型对象的测试
  • 隔离 — 测试程序拥有自己独立的进程,以最大限度地提高性能
  • 简易的api

创建一个vue 测试项目

我们这边使用 vue2 的vue-cli。 其实由于在创建的时候vue-cli 就会让我们选要不要测试框架,选好后,选jest作为我们的测试框架就好了。

是不是很简单

jest入门使用

toBe, toEqual, not

Jest使用“匹配器”让你以不同的方式测试值。 本文档将介绍一些常用的匹配器。

test('two plus two is four', () => {
 expect(2 + 2).toBe(4);
})

toBe 使用 Object.is 来判断是否正确。 如果你需要检查一个对象 , 可以使用 toEqual 来替代。

test('object assignment', () => {
 const data = {one : 1};
 data['two'] = 2;
 expect(data).toEqual({one : 1, two: 2});
})

我们还可以测试匹配器的反面:

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);
    }
  }
});

区分 undefined, null , false

  • toBeNull 仅仅判断 null
  • toBeUndefined 仅仅判断 undefined
  • toBeDefined 与 toBeUndefined 相反
  • toBeTruthy 匹配if语句视为true的任何内容
  • toBeFalsy匹配if语句视为false的任何内容
test('null', () => {
 const n = null;
 expect(n).toBeNull();
})

数字

比较数字的大多数方法都具有匹配器等效项。

test('two plus two', () => {
    const value = 2 + 2;
    expect(value).toBeGreaterThanOrEqual(4)
})

对于浮点相等,请使用toBeCloseTo而不是toEqual,因为您不希望测试依赖于微小的舍入误差。

test('adding floating point numbers', () => {
  const value = 0.1 + 0.2;
  expect(value).toBeCloseTo(0.3);
});

字符串

可以使用toMatch根据正则表达式检查字符串

test('but there is a "stop" in Christoph', () => {
  expect('Christoph').toMatch(/stop/);
});

数组和可迭代数据

您可以使用toContain检查数组或可迭代项是否包含特定项:

const shoppingList = [
      'beer',
      'kleenex',
      'paper',
  ]
  test('the shopping list has beer on it', () => {
      expect(shoppingList).toContain('beer');
  })

例外

如果要测试特定函数在调用时是否引发错误,请使用toThrow。

function compileAndroidCode() {
  throw new Error('you are using the wrong JDK');
}

测试异步代码

在JavaScript中,异步运行代码是很常见的。 当您具有异步运行的代码时,Jest需要知道它所测试的代码何时完成,然后才能继续进行其他测试。 jest 有几种处理方法。

回调函数

最常见的异步模式是回调

假如, 你有一个 fetchData (callback) 函数, 该函数可获取一些数据并在完成后调用 callback。 你要测试此返回的数据是否为字符串 peanum butter

test('the data is peanut butter', () => {
  function callback(data) {
    expect(data).toBe('peanut butter');
  }

  fetchData(callback);
});

promises

如果您的代码使用Promise,则有一种更简单的方法来处理异步测试。 从测试中返回一个承诺,Jest将等待该承诺解决。 如果承诺被拒绝,则测试将自动失败。

例如,假设fetchData而不是使用回调,而是返回应为字符串’peanut butter’解析的Promise。 我们可以用以下方法进行测试:

test('the data is peanut butter', () => {
 return fetchData().then(data => {
  expect(data).toBe('peanut butter');
 })
})

Async/Await

或者, 你可以使用 async 和 await 在你测试用例中。 要编写异步测试, 得在传递给测试的函数前面使用 async 关键字。

test('the data is peanut' , async () => {
	const data = await fetchData();
    expect(data).toBe('peanut butter');
})

你可以结合 async和await与 .resolves 或者 .rejects

test('the data is peanut butter', async () => {
 await expect(fetchData()).resolves.toBe()
})

test('the fetch fails with an error', async () => {
  await expect(fetchData()).rejects.toThrow('error');
});

设置和拆除

通常在编写测试时, 你需要在测试运行之前进行一些设置工作, 而在测试运行后需要进行一些整理工作。 jest 提供了辅助功能来处理此问题

对许多测试重复设置

如果您有一些工作需要对许多测试重复进行,则可以使用beforeEach和afterEach。

beforeEach(() => {
    console.log('before')
})
afterEach(() => {
    console.log('after');
})
test('city', () => {
    expect(1).toBeTruthy();
})

一次性设置

beforeAll(() => {
    console.log('before')
})
afterAll(() => {
    console.log('after');
})

test('city' ,() => {
    expect(1).toBeTruthy();
})

test('n1', () => {
    expect(0).toBeFalsy();
})

mock 函数

模拟函数允许您通过擦除函数的实际实现,捕获对该函数的调用(以及在这些调用中传递的参数),捕获用new实例化的构造函数实例以及测试时间配置来测试代码之间的链接。 返回值。

有两种模拟函数的方法:通过创建要在测试代码中使用的模拟函数,或编写手动模拟来覆盖模块依赖性。

使用一个 mock 函数

假设我们正在测试forEach函数的实现,该函数将为提供的数组中的每个项目调用一个回调。

function forEach(items, callback) {
 for (let index = 0; index < items.length ; index ++) {
  callback(items[index]);
 }
}

为了测试此功能,我们可以使用模拟功能,并检查模拟的状态以确保按预期方式调用回调。

const mockCallback = jest.fn(x => 42 + x);
forEach([0, 1], mockCallback);

// The mock function is called twice
expect(mockCallback.mock.calls.length).toBe(2);

// The first argument of the first call to the function was 0
expect(mockCallback.mock.calls[0][0]).toBe(0);

// The first argument of the second call to the function was 1
expect(mockCallback.mock.calls[1][0]).toBe(1);

// The return value of the first call to the function was 42
expect(mockCallback.mock.results[0].value).toBe(42);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值