首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Moxios模拟Axios调用,以测试API调用

使用Moxios模拟Axios调用,以测试API调用
EN

Stack Overflow用户
提问于 2017-09-12 14:39:02
回答 1查看 17.6K关注 0票数 3

我有以下自定义的Axios实例:

代码语言:javascript
复制
import axios from 'axios'

export const BASE_URL = 'http://jsonplaceholder.typicode.com'

export default axios.create({
  baseURL: BASE_URL
})

提供相应的服务:

代码语言:javascript
复制
import http from './http'

export async function fetchUserPosts(id) {
  const reponse = await http.get(`/users/${id}/posts`)
  return reponse.data
}

这是对上述服务的测试:

代码语言:javascript
复制
import moxios from 'moxios'
import sinon from 'sinon'
import http from '@/api/http'
import { fetchUserPosts } from '@/api/usersService'

describe('users service', () => {
  beforeEach(() => {
    moxios.install(http)
  })

  afterEach(() => {
    moxios.uninstall(http)
  })

  it('fetches the posts of a given user', (done) => {
    const id = 1
    const expectedPosts = ['Post1', 'Post2']

    moxios.stubRequest(`/users/${id}/posts`, {
      status: 200,
      response: expectedPosts
    })

    const onFulfilled = sinon.spy()
    fetchUserPosts(1).then(onFulfilled)

    moxios.wait(() => {
      expect(onFulfilled.getCall(0).args[0].data).toBe(expectedPosts)
      done()
    })
  })
})

在使用Karma + Jasmine执行时,会引发以下错误:

代码语言:javascript
复制
Uncaught TypeError: Cannot read property 'args' of null thrown

我想测试的是,当端点/users/{id}/posts被击中时,将返回一个模拟的响应。所有这些都是在使用我的自定义axios实例http时进行的。

我已经尝试了作为艾默斯显示文档的第一个例子。但是,我认为这不适合我的用例,因为我想检查请求是否在我的服务中正确地形成。

我还尝试了以下代码,这些代码与预期的一样工作,但是我想测试我的服务(下面的代码不执行):

代码语言:javascript
复制
import axios from 'axios'
import moxios from 'moxios'
import sinon from 'sinon'

describe('users service', () => {
  beforeEach(() => {
    moxios.install()
  })

  afterEach(() => {
    moxios.uninstall()
  })

  it('fetches the posts of a given user', (done) => {
    const id = 1
    const expectedPosts = ['Post1', 'Post2']

    moxios.stubRequest(`/users/${id}/posts`, {
      status: 200,
      response: expectedPosts
    })

    const onFulfilled = sinon.spy()
    axios.get(`/users/${id}/posts`).then(onFulfilled)

    moxios.wait(() => {
      expect(onFulfilled.getCall(0).args[0].data).toBe(expectedPosts)
      done()
    })
  })
})

对如何纠正这个错误有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-04 16:29:16

我知道这是一个老问题,但当我遇到同样的问题时,我会发布我的方法:

在本例中,您不需要使用sinon,因为您有一个axios实例,可以使用它来配置moxios (就像您已经做的那样)

代码语言:javascript
复制
beforeEach(() => {
    moxios.install(http)
  })
  afterEach(() => {
    moxios.uninstall(http)
})

然后像这样测试您的方法:

代码语言:javascript
复制
it('test get', async () => {
     const expectedPosts = ['Post1', 'Post2']

     moxios.wait(() => {
          const request = moxios.requests.mostRecent()
          request.respondWith({ status: 200, response: expectedPosts }) //mocked response
     })

     const result = await fetchUserPosts(1)
     console.log(result) // ['Post1','Post2'] 
     expect(result).toEqual(expectedPosts)
})

就这样。

问候

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46179297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档