当前位置:  开发笔记 > 前端 > 正文

使用Vue,Axios和Mocha对HTTP请求进行单元测试

如何解决《使用Vue,Axios和Mocha对HTTP请求进行单元测试》经验,为你挑选了1个好方法。

我正在努力尝试使用Mocha/Chai-Sinon在VueJS中测试请求,将Axios作为请求库并尝试混合使用Moxios和 axios-mock-adaptor.以下示例与后者有关.

我正在尝试做的是在创建组件时发出请求,这很简单.

但测试要么抱怨results变量未定义,要么抱怨async timout.

我是通过分配变量来做到的 getData() function? Or should I返回值做到的吗?任何帮助,将不胜感激.

零件

  // Third-party imports
  import axios from 'axios'
  // Component imports
  import VideoCard from './components/VideoCard'

  export default {
    name: 'app',
    components: {
      VideoCard
    },
    data () {
      return {
        API: '/static/data.json',
        results: null
      }
    },
    created () {
      this.getData()
    },
    methods: {
      getData: function () {
        // I've even tried return instead of assigning to a variable
        this.results = axios.get(this.API)
          .then(function (response) {
            console.log('then()')
            return response.data.data
          })
          .catch(function (error) {
            console.log(error)
            return error
          })
      }
    }
  }

测试

import Vue from 'vue'
import App from 'src/App'

import axios from 'axios'
import MockAdapter from 'axios-mock-adapter'

let mock = new MockAdapter(axios)

describe('try and load some data from somewhere', () => {
  it('should update the results variable with results', (done) => {
    console.log('test top')
    mock.onGet('/static/data.json').reply(200, {
      data: {
        data: [
          { id: 1, name: 'Mexican keyboard cat' },
          { id: 2, name: 'Will it blend?' }
        ]
      }
    })

    const VM = new Vue(App).$mount

    setTimeout(() => {
      expect(VM.results).to.be.null
      done()
    }, 1000)
  })
})

xenetics.. 6

我不确定moxios模拟适配器,但我有类似的斗争.我最终使用了vue-webpack模板使用axios和moxios.我的目标是伪造一些博客文章,并声称它们被分配到this.posts变量.

你的getData()方法应该像你说的那样返回axios promise - 这样,我们就可以通过某种方式告诉测试方法完成了promise.否则它会继续下去.

然后在getData()的成功回调中,您可以分配您的数据.所以它看起来像

return axios.get('url').then((response) {
   this.results = response
})

现在你的测试就像

it('returns the api call', (done) => {
    const vm = Vue.extend(VideoCard)
    const videoCard = new vm()

    videoCard.getData().then(() => {
        // expect, assert, whatever
    }).then(done, done)
)}

注意使用done().这只是一个指南,你必须根据你正在做的事情来修改它.如果您需要更多详细信息,请与我们联系.我建议使用moxios来模拟axios调用.

这是一篇关于测试帮助我的api调用的好文章.

https://wietse.loves.engineering/testing-promises-with-mocha-90df8b7d2e35#.yzcfju3qv



1> xenetics..:

我不确定moxios模拟适配器,但我有类似的斗争.我最终使用了vue-webpack模板使用axios和moxios.我的目标是伪造一些博客文章,并声称它们被分配到this.posts变量.

你的getData()方法应该像你说的那样返回axios promise - 这样,我们就可以通过某种方式告诉测试方法完成了promise.否则它会继续下去.

然后在getData()的成功回调中,您可以分配您的数据.所以它看起来像

return axios.get('url').then((response) {
   this.results = response
})

现在你的测试就像

it('returns the api call', (done) => {
    const vm = Vue.extend(VideoCard)
    const videoCard = new vm()

    videoCard.getData().then(() => {
        // expect, assert, whatever
    }).then(done, done)
)}

注意使用done().这只是一个指南,你必须根据你正在做的事情来修改它.如果您需要更多详细信息,请与我们联系.我建议使用moxios来模拟axios调用.

这是一篇关于测试帮助我的api调用的好文章.

https://wietse.loves.engineering/testing-promises-with-mocha-90df8b7d2e35#.yzcfju3qv

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有