在vue项目中,vuex是经常使用的一个插件,这个插件用来管理项目中的数据。那么在测试中又应该怎么测试vuex呢?接下来,就说一说测试vuex的方法。测试vuex的方法分为两种,一种是分别测试vuex的组成部分,一种是把vuex的store作为一个整体进行测试。

分别测试vuex的组成部分

vuex由mutations、actions、getters、state组成,第一种方法就是分别对这些部分进行测试。

测试mutation

一个mutation测试的最终断言始终是要检查一个state对象是否被正确更改,因为这是mutation的目的。你可以将更改后的state对象视为一个mutation的输出。如果你的mutation没有改变state对象,那就说明你没有正确地使用它们。

import mutation from '../mutations'
describe('mutation',()=>{test('setItems',()=>{const items = [{id:1},{id:2}];const state = {items:[]}mutations.setItems(state,{items});expect(state.items).toBe(items);});
});

测试getters

同mutation一样,Vuex getter也是普通的JavaScript函数。getter始终返回一个值,这样使要测试的内容变得简单化,你将始终断言getter函数的返回值。要测试getter,可以使用一个假的state对象调用getter函数,该state对象包含getter将使用的值,然后断言getter是否返回你期望的结果。

import getters from '../getters';describe('getters',()=>{test('displayItems',()=>{const items = Array(21).fill().map((v,i)=> i);// 构造一个假的stateconst state = {items}const result = getters.displayItems(state);const expectedResult = item.slice(0,20);expect(result).toEqual(expectedResult);});
});

测试action

action使你能够异步提交mutation。通常,action会进行API调用并提交结果。因为action可以是异步的,并且可以发送HTTP请求,所以同mutation或getter相比,为action编写单元测试要更复杂。

要测试action,我们需要按照Vuex调用它的方式调用该函数,并断言该action是否按你的期望执行。通常,这意味着要利用模拟避免产生HTTP调用。

我们可以使用jest.mock()方法模拟请求。

import actions from '../actions'
import {fetchListData}from '../../api/api'
import flushPromises from 'flush-promises'
jest.mock('../../api/api')
describe('actions',()=>{test('fetchListData',async ()=>{expect.assertions(1)const items= [{},{}]const type = 'top'fetchListData.mockImplentationOnce(calledWidth => {return calledWith === type ? Promise.resolve(items) : Promise.resolve();})const context = {commit:jest.fn()}actions.fetchListData(context,{type});await flushPromises();expect(context.commit).toHaveBeenCalledWith('setItems',{items});});
})

测试vuex store整体

这种方法是把vuex作为一个整体进行测试的方法。
要测试它,先在Vue构造函数上安装Vuex,再创建一个store并通过commit提交一个mutation。然后,你可以断言在提交mutation后state会发生变化。

import {cloneDeep} from 'lodash'
import {createLocalVue} from '@vue/test-utils'
import flushPromises from 'flush-promises';
import {createVuex} from 'vuex';
import {fetchListData} from '../../api/api'
jest.mock('../../api/api');
function createItems(){const arr = new Array(22);return arr.fill().map((item,i)=>{return {id:`${i}`,name:'item'}});
}
describe('store',()=>{test('fetchListData',async ()=>{expect.assertions(1);const items = createItems();// 通过克隆得到store配置对象,避免测试用例间的干扰const clonedStoreCofig(cloneDeep({}));const store = createStore(clonedStoreConfig);const type = 'top'fetchListData.mockImplementation(calledType => {return calledType === type ? Promise.resolve(items) :Promise.resolve();});store.dispatch('fetchListData',{type});await flushPromisses();expect(store.getters.displayItems).toEqual(items.slice(0,20));});
});

测试组件中的vuex

为了能够测试组件中的vuex是否正常工作,我们需要先创建一个vuex的实例并传递给组件。

import {shallowMount,createLocalVue} from '@vue/test-utils'
import {createStore}from 'vuex'
import flushPromises from 'flush-promises'
import itemList from '../ItemList.vue'
import Item from '../../components/Item.vue'
const localVue = createLocalVue();
localVue.use(Vuex)
describe('ItemList.vue',()=>{let storeOptions;let store;beforeEach(()=>{storeOptions = {getters:{displayItems:jest.fn()},actions:{fetchListData:jest.fn(()=>{return Promise.resolve()});}};store = createStore(storeOptions);});test('render Items',()=>{const $bar = {start:()=>{},finish:()=>{}}const items = [{},{},{}]storeOptions.getters.displayItems.mockReturnValue(items);const wrapper = shallowMount(ItemList,{mocks:{$bar},localVue,store});const Items = wrapper.findAll(Item)expect(Items).toHaveLength(items.length);Items.wrappers.forEach((wrapper,i)=>{expect(wrapper.vm.item).toBe(items[i]);})});
});

jest测试vuex相关推荐

  1. 使用Jest测试JavaScript (入门篇)

    1 什么是 Jest? Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言.JSDom.覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的测试框架. ...

  2. jest测试ajax,ajax – 如何使用Jest来测试React呈现的异步数据?

    我正在使用React for render和Jest / Jasmine进行测试.我使用旧的Jest / Jasmine等待测试并运行,但现在这些已经在Jasmine 2中消失了,我不知道如何用新的a ...

  3. react jest测试_如何使用React测试库和Jest开始测试React应用

    react jest测试 Testing is often seen as a tedious process. It's extra code you have to write, and in s ...

  4. react jest测试_如何使用Jest和react-testing-library测试Socket.io-client应用程序

    react jest测试 by Justice Mba 由Mba法官 如何使用Jest和react-testing-library测试Socket.io-client应用程序 (How to test ...

  5. react jest测试_如何设置Jest和Enzyme来测试React Native应用

    react jest测试 by Sam Ollason 通过萨姆·奥拉森(Sam Ollason) This short article shares my experiences setting u ...

  6. Jest测试语法系列之Expect

    Methods Expect主要用于实现验证操作,Jest的Expect提供了如下的验证方法: expect(value) expect.extend(matchers) expect.anythin ...

  7. 使用Jest测试JavaScript (入门篇) 1

    1 什么是 Jest? Jest Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言.JSDom.覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的 ...

  8. Jest测试框架学习(一)

    前言 jest是针对JavaScript的测试框架.如果遵循TDD原则,在任何功能开发之前都需要先写测试.而测试分为单元测试,集成测试和系统测试. 单元测试 单元测试可以理解为对于单个函数(单一功能) ...

  9. Jest测试入门到使用

    Jest 测试使用说明 Jest 测试 什么是测试 作为开发来讲可以简单把代码分为两种,一种是业务代码,一种是业务无关的代码.测试代码就是典型的业务无关的代码.不过按照我的定义可以把测试代码定位为:可 ...

最新文章

  1. 为什么在中国“公有云”落地那么难?
  2. “国家使命”图书第一批权威发布
  3. YOLOv3 Darknet安装编译与训练自己的数据集
  4. Yii Listview
  5. 深度思考 Spring Cloud + Alibaba Sentinel 源码原理
  6. oracle菜鸟学习之 复杂的更新语句使用
  7. MiPony– 杀手级免费网盘下载工具 可挂机下载支持YunFile
  8. linux java不能运行命令,linux java不能运行命令
  9. OpenCV下载地址分享
  10. CodeBlocks汉化包
  11. 实验报告 三 密码破解技术
  12. LocalDateTime设定某一时间值,转Date
  13. 如何彻底杀死/关闭烦人的弹窗广告
  14. 【JAVA】-- 黄金矿工小游戏(一)(实现思路+每步代码)
  15. 我退休金只有2000块钱能去海南三亚养老吗?
  16. Mac小技巧:强制退出程序的六种方法
  17. 如何下载jquery的jar包
  18. B树的查找、插入、删除(附源代码)
  19. catv系统主要有哪三部分组成_CATV系统组成包括( )_学小易找答案
  20. 无root 修改/usr/lib/x86_64-linux-gnu/libstdc 解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: v

热门文章

  1. 易语言运行执行exe文件的三种方法
  2. Android运行机制详解
  3. 四、docker系列之docker安装常用软件
  4. Redis缓存淘汰机制
  5. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)
  6. 玄武科技招股书失效:首次冲刺港交所上市折戟,毛利率连年下滑
  7. java-php-python-ssm学生选拔系统计算机毕业设计
  8. 自然语言处理学习——论文分享——A Mutual Information Maximization Perspective of Language Representation Learning
  9. Mat 与Mat区别
  10. 巨巨的磁盘(线段树)