18

我正在使用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' }
  ]
});

我怎么知道是否调用了“/用户”?

我正在寻找类似于您可以在 Jest 中执行的操作:

expect(mockFunc).toHaveBeenCalledTimes(1)

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

4

3 回答 3

17

注意:此答案现已过时,请参阅Laszlo Sarvold 的此答案。


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

对于你上面的例子

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

注意:根据您使用的内容,您可能必须将您的期望语句包装在 setTimeout(function, 0) 中才能正常工作

于 2018-04-10T19:07:56.470 回答
6

根据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
于 2021-03-10T11:58:47.067 回答
4

另一种选择是做

//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

干杯。

于 2020-11-28T00:27:40.980 回答