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

Cés*_*rca 2 javascript unit-testing axios moxios

我有以下自定义Axios实例:

import axios from 'axios'

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

export default axios.create({
  baseURL: BASE_URL
})
Run Code Online (Sandbox Code Playgroud)

配合相应的服务:

import http from './http'

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

这是对上述服务的测试:

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()
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

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

Uncaught TypeError: Cannot read property 'args' of null thrown
Run Code Online (Sandbox Code Playgroud)

我要测试的是,当/users/{id}/posts命中端点时,将模拟响应发送回。所有这一切都使用我的自定义axios实例http

我试过磕碰作为moxios文件的第一个例子所示。但是,我认为这不适合我的用例,因为我想检查请求是否在我的服务中正确形成。

我还尝试了下面的代码,该代码可以按预期工作,但是我想测试我的服务(以下代码不起作用):

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()
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

关于如何解决错误的任何想法?

Elm*_*tas 8

我知道这是一个古老的问题,但是当我遇到相同的问题时,我将发布自己的方法:

sinon在这种情况下,您无需使用,因为您有的实例axios,请使用它进行配置moxios(如您已经完成的操作)

beforeEach(() => {
    moxios.install(http)
  })
  afterEach(() => {
    moxios.uninstall(http)
})
Run Code Online (Sandbox Code Playgroud)

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

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)
})
Run Code Online (Sandbox Code Playgroud)

而已。

问候