您如何验证使用axios-mock-adapter发出请求?

时间:2017-12-08 14:57:11

标签: unit-testing axios axios-mock-adapter

我正在使用https://github.com/ctimmerm/axios-mock-adapter

我想知道如何验证端点是否被被测系统实际调用。

在这个例子中:

var axios = require('axios');
var MockAdapter = require('axios-mock-adapter');

// This sets the mock adapter on the default instance
var mock = new MockAdapter(axios);

// Mock any GET request to /users
// arguments for reply are (status, data, headers)
mock.onGet('/users').reply(200, {
  users: [
    { id: 1, name: 'John Smith' }
  ]
});

我怎么能判断是否有用户' /#39;被称为?

我正在寻找类似于你在Jest中可以做的事情:

expect(mockFunc).toHaveBeenCalledTimes(1)

我意识到在使用函数回复时可以使用一些自定义逻辑,并设置一个局部变量来指示是否已经发出请求。我只是想知道是否有更清洁的方法。

3 个答案:

答案 0 :(得分:5)

axios-mock-adapter似乎没有内置此功能,但是如果您使用的是jest,则可以使用jest.spyOn。

上面的例子

let spy = jest.spyOn(axios, "get");
//run http request here
expect(spy).toHaveBeenCalled();

注意:根据您使用的内容,您可能需要在setTimeout(函数,0)中包含expect语句才能使其正常工作

答案 1 :(得分:3)

根据 https://github.com/ctimmerm/axios-mock-adapter,有一个用于验证请求调用的开箱即用功能:

expect(mock.history.post.length).toBe(1); // times called
expect(mock.history.post[0].data).toBe(JSON.stringify({ foo: "bar" })); // posted object

答案 2 :(得分:0)

另一种替代方法是

//OP's Code
var axios = require('axios');
var MockAdapter = require('axios-mock-adapter');

// This sets the mock adapter on the default instance
var mock = new MockAdapter(axios);

// Mock any GET request to /users
// arguments for reply are (status, data, headers)
mock.onGet('/users').reply(200, {
  users: [
    { id: 1, name: 'John Smith' }
  ]
});

const spy = jest.spyOn(mock, 'onGet');

//function call here

expect(spy).toHaveBeenCalledWith('/users')

从本质上讲,由于模拟“拦截” axios调用,因此您无法测试axios.get调用,因为它从未真正发生过。但是mock.onGet函数确实得到执行,您也可以验证使用了什么路由。

在嘲笑axios时尝试监视它,这将使您看起来像这样的错误

expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected: "/users"

Number of calls: 0

干杯。