Vue学习——引入mock进行测试

Posted sadoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue学习——引入mock进行测试相关的知识,希望对你有一定的参考价值。

前言

按照前后端分离的架构设计思路,通常前端通过axios调用后端接口。如果后端接口未写好,前端如何进行测试呢?这时候就要引入mock。mock会拦截前端请求,并生成测试数据。这样看起来就像调用了后端接口一样。虽然mock不能实现什么业务功能,但作为前端开发,引入mock也是必不可少的。

引入mock

由于mock的作用本来就是用于相应ajax调用,因此我们沿用《Vue学习(七)——引入Axios》建好的项目作为例子。在此之上引入mock并使用。

首先在项目内安装mock.js依赖

npm install mockjs --save

在src目录下新建mock目录,在mock目录下新建文件index.js

import Mock from 'mockjs';

Mock.mock('/api/hello', 
  'code': 200,
  'name': 'test helloController', 
);

Mock.mock('/api/hello/name', 'post', function(param)
  let data = param.body
  return 'hello ' + data
);

这里我们写上/hello和/hello/name这两个接口对应返回数据。这里仅展示简单的使用方法,其他使用方法请参考mockjs官网。

接着在main.js中引入

import Vue from 'vue'
import App from './App.vue'

import axios from 'axios'
Vue.prototype.$axios = axios
Vue.config.productionTip = false

require('./mock');

new Vue(
  render: h => h(App),
).$mount('#app')

第8行引入mock。这样当我们通过axios发送请求给后台时,mock就会拦截这个请求并返回之前设置的数据。看起来就像前端真的调用了后端接口那样。方便我们后续开发和调试。

之后启动程序,点击按钮进行测试,点开f12查看输出。注意只看控制台输出,不要看网络那里,因为mock拦截了之后,网络请求没有发出去。这部分就不展示了。

mock的随机生成数据

mock的一大特点是随机生成数据。如果数据要一个一个自己写,尤其是字段多,测试需要的样本大的话,就很麻烦。例如测试分页的有效性,查询过滤的效果是否正确等等。

这里通过一个表格来展示,因此需要引入element ui的表格组件。在项目下增加对element ui的依赖:

npm install element-ui --save

在main.js中引入,修改main.js

import Vue from 'vue'
import App from './App.vue'

import axios from 'axios'
Vue.prototype.$axios = axios
Vue.config.productionTip = false

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

require('./mock');

new Vue(
  render: h => h(App),
).$mount('#app')

第8-11行引入element-ui。

接下来新建api调用,在src/api目录下新建score.js

import request from '../utils/request'

export function all() 
  return request(
    url: '/score/all',
    method: 'get'
  )

这里我们定义一个api为all,意思是获取全部数据,为了和后面分页的list调用区分开来。

接下来是重点,添加mock随机数据,在src/mock目录下新建mockscore.js

import Mock from 'mockjs';

Mock.mock('/api/score/all', 
    'data|10': [
      'id|+1':1, 'name':'@name', 'score|70-100':100
    ]
);

上面充分反映了mock随机生成数据的特点。上面的意思是生成一个名为data的10个元素的数组,id字段起始为1,递增1;name字段随机生成名字;score字段随机生成70-100的数字。mock生成随机数据的玩法很多,具体的规则请参考官网。

我们新建一个页面,页面列表展示列表数据,在src/components下新建Score.vue

<template>
  <div>
     <template>
    <el-table :data="tableData" style="width: 50%">
      <el-table-column prop="id" label="id" width="180"></el-table-column>
      <el-table-column prop="name" label="姓名" width="180"></el-table-column>
      <el-table-column prop="score" label="分数" width="180"></el-table-column>
    </el-table>
  </template>
  </div>
</template>

<script>
import  all  from '@/api/score.js'
require('../mock/mockscore.js');


export default 
  name: 'MyTable',
  data() 
    return 
      tableData: [],
    
  ,
  created()
    all().then(res => 
      this.tableData = res.data
    )
  ,
  methods: 
  

</script>

<style scoped>
</style>

这里显示一个简单列表,页面加载时调用all方法,把调用返回的数据设置到tableData变量中。

最后在App.vue中,我们把引用HelloWord模块改为引用Score模块(只是测试展示效果,正常项目应该增加路由,访问对应的url)。修改App.vue

<template>
  <div id="app">
    <Score/>
  </div>
</template>

<script>
import Score from './components/Score.vue'

export default 
  name: 'App',
  components: 
    Score
  

</script>

<style>
</style>

启动项目,访问localhost:8080:

可以看到我们的随机数据生成了。下一步就是增删查改的问题了。

mock的增删查改

mock数据增删查改相对来说还是比较麻烦,因为通常增删查改是交给数据库去做,一条指令就完事了。但mock里面,我们得自己去维护。尤其是查询时,我们得自行筛选数据,如果涉及到排序什么的,就更麻烦了。这里就展示简单一点的情况。由于代码量比较大,所以写得并不完善,仅展示如何使用。

首先做一些准备,写好增删查改功能的api。修改src/api下的score.js

import request from '../utils/request'

export function all() 
  return request(
    url: '/score/all',
    method: 'get'
  )


export function add(param) 
  return request(
    url: '/score/add',
    method: 'post',
    data: param
  )


export function update(param) 
  return request(
    url: '/score/update',
    method: 'post',
    data: param
  )


export function del(id) 
  return request(
    url: '/score/delete',
    method: 'post',
    data: id
  )


export function list(param) 
  return request(
    url: '/score/list',
    method: 'post',
    data: param
  )

然后修改src/mock/mockscore.js,添加增删查改方法

import Mock from 'mockjs';

const StudentData = Mock.mock(
    'data|10': [
      'id|+1':1, 'name':'@name', 'score|70-100':100
    ]
);

Mock.mock('/api/score/all', 'get', function()
  const resMsg = 
    'code': 200,
    'data': StudentData.data,
    'msg': '获取成功'
  
  return resMsg
)

Mock.mock('/api/score/add', 'post', function(data)
  let student = JSON.parse(data.body)
  student.id = parseInt(student.id)
  student.score = parseInt(student.score)
  StudentData.data.push(student)
  const resMsg = 
    'code': 200,
    'msg': '添加成功'
  
  return resMsg
);

Mock.mock('/api/score/list', 'post', function(data)
  let resData = []
  let queryParam = JSON.parse(data.body)
  for(let index in StudentData.data)
    if(queryParam.id == undefined || queryParam.id == null || queryParam.id == '')
      resData.push(StudentData.data[index])
    else
      if(StudentData.data[index].id == queryParam.id)
        resData.push(StudentData.data[index])
      
    
  
  const resMsg = 
    'code': 200,
    'data': resData,
    'msg': '查询成功'
  
  return resMsg
);

Mock.mock('/api/score/update', 'post', function(data)
  let student = JSON.parse(data.body)
  student.id = parseInt(student.id)
  student.score = parseInt(student.score)
  for(let index in StudentData.data)
    if(StudentData.data[index].id == student.id)
      StudentData.data[index] = student
    
  
  const resMsg = 
    'code': 200,
    'msg': '修改成功'
  
  return resMsg
);

Mock.mock('/api/score/delete', 'post', function(data)
  let id = parseInt(JSON.parse(data.body))
  for(let index in StudentData.data)
    if(StudentData.data[index].id == id)
      StudentData.data.splice(index, 1)
      break
    
  
  const resMsg = 
    'code': 200,
    'msg': '删除成功'
  
  return resMsg
);

思路很简单,对于新增,就是往数组里push;对于修改,就是找到对应的id的元素,然后替换;对于删除,就是找到对应id元素,使用splice函数删除;对于查询,就比较复杂了,得把符合条件的元素提取出来并返回。这里只对id查询进行处理,再多的话代码比较复杂,读者可自行尝试。

然后修改src/components/Score.vue:

<template>
  <div>
    <template>
      <el-form ref="form" :inline="true" :model="queryForm" label-width="80px">
        <el-form-item label="id">
          <el-input v-model="queryForm.id"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onSearch">查询</el-button>
        </el-form-item>
      </el-form>
      
      <el-button type="primary" @click="onAdd">新增</el-button>
      <el-table :data="tableData" style="width: 50%">
        <el-table-column prop="id" label="id" width="180"></el-table-column>
        <el-table-column prop="name" label="姓名" width="180"></el-table-column>
        <el-table-column prop="score" label="分数" width="180"></el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button @click="onUpdate(scope.row)" type="text" size="small">修改</el-button>
            <el-button @click="onDelete(scope.row)" type="text" size="small">删除</el-button>
          </template>
        </el-table-column>
      </el-table>

      <el-dialog :title="title" :visible.sync="dialogVisible">
        <el-form ref="form" :model="form" label-width="80px">
          <el-form-item label="id">
            <el-input v-model="form.id"></el-input>
          </el-form-item>
          <el-form-item label="姓名">
            <el-input v-model="form.name"></el-input>
          </el-form-item>
          <el-form-item label="分数">
            <el-input v-model="form.score"></el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="onSubmit">确认</el-button>
            <el-button @click="onCancel">取消</el-button>
          </el-form-item>
        </el-form>
      </el-dialog>
    </template>
  </div>
</template>

<script>
import  all, add, update, del, list  from '@/api/score.js'
require('../mock/mockscore.js');


export default 
  name: 'MyTable',
  data() 
    return 
      tableData: [],
      form: 
        id: null,
        name: '',
        score: null,
      ,
      title: '',
      dialogVisible: false,
      queryForm: 
        
      
    
  ,
  created()
    all().then(res => 
      console.log(res)
      this.tableData = res.data
    )
  ,
  methods: 
    onSearch()
      list(this.queryForm).then(res => 
        this.tableData = res.data
      )
    ,
    onAdd()
      this.title = '新增'
      this.dialogVisible = true
    ,
    onUpdate(row)
      this.title = '修改'
      this.dialogVisible = true
      this.form = row
    ,
    onDelete(row)
      del(row.id).then(res =>
        console.log(res)
        this.onSearch()
      )
    ,
    onSubmit()
      if(this.title == '新增')
        add(this.form).then(res =>
          console.log(res)
          this.dialogVisible = false
          this.onSearch()
        )
      else if(this.title == '修改')
        update(this.form).then(res => 
          console.log(res)
          this.dialogVisible = false
          this.onSearch()
        )
      
    ,
    onCancel()
      this.dialogVisible = false
      this.resetForm()
    ,
    resetForm()
      this.form = 
        id: null,
        name: '',
        score: null
      
    
  

</script>

<style scoped>
</style>

这里的代码不是重点,毕竟更多是涉及增删查改前端界面的处理逻辑,和mock本身无关,仅提供给读者参考。

小结

mock的使用不复杂,上手很快,一般是用来作为前端测试,不会搞得很复杂。希望读者通过这篇文章,能在项目中快速上手mock

 

以上是关于Vue学习——引入mock进行测试的主要内容,如果未能解决你的问题,请参考以下文章

Vue学习——引入mock进行测试

mock.js学习之路一(Vue中使用)

mock.js 的介绍与使用

vue中引入mock.js

(转)Jmock快速上手教程

在python中,为什么mock_calls在调试模式下运行时调用.__ str __()调用的次数不一致?