使用 axios-mock-adapter 验证请求?
Verify request with axios-mock-adapter?
我使用 axios-mock-adapter
的 MockAdapter 进行了以下测试。但是我试图断言 get 函数已被有效调用,所以我创建了一个间谍。
由于某种原因,它似乎不起作用,我得到:
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
这是我的测试:
it('gets publications', async() => {
let spy = jest.spyOn(axios, "get");
var mock = new MockAdapter(axios);
mock.onGet(PUBLICATIONS_PATH + '/publications').reply(200,
{
answer: {
publications: [ "pub1", "pub2", "pub3" ]
}
});
let queryParameters = {
operation: 'FSale'
}
const publications = await PublicationService.getPublications(queryParameters);
expect(publications.data.answer.publications).toEqual([ "pub1", "pub2", "pub3" ]); // works fine
expect(spy).toHaveBeenCalled(); //This fails
})
我实际上是在尝试使用这种方法 。
更新:这是 getPublications
的代码
async function _getPublications(queryParameters){
return await axios({
method: 'get',
url: `${PUBLICATIONS_PATH}/publications`,
cancelToken: CancelTokenService.getSource().token,
params: queryParameters,
headers: {
authorization: LocalStorageService.getAuthorization(),
'Accept': ResourcesVersions.PUBLICATION
}
}).then(function (response){ return response }).catch(function (error){ return (axios.isCancel(error) ? error : error.response) })
}
我不习惯在我的测试中使用 jest.spy
,但我认为你可以尝试类似的东西:
import axios from 'axios';
jest.mock('axios');
...
it('gets publications', async() => {
const get = axios.get.mockResolvedValueOnce(yourMockedData)
let queryParameters = {
operation: 'FSale'
}
const publications = await PublicationService.getPublications(queryParameters);
expect(publications.data.answer.publications).toEqual([ "pub1", "pub2", "pub3" ]); // works fine
expect(get).toHaveBeenCalled(); //This fails
})
在您提供的测试代码中,您正在监视 axios get
方法,但在 getPublications
方法中您没有调用该方法。相反,您直接调用 axios
方法。
由于监视 axios
默认方法并不容易,我建议更改 getPublications
中的代码以使用 get
方法:
async function _getPublications(queryParameters){
return await axios.get(`${PUBLICATIONS_PATH}/publications`, {
cancelToken: CancelTokenService.getSource().token,
params: queryParameters,
headers: {
authorization: LocalStorageService.getAuthorization(),
'Accept': ResourcesVersions.PUBLICATION
}
}).then(function (response){ return response }).catch(function (error){ return (axios.isCancel(error) ? error : error.response) })
}
您可以使用 https://github.com/ctimmerm/axios-mock-adapter#history 功能来检查已进行的实际调用并断言 URL、headers、方法和 what-else。
我使用 axios-mock-adapter
的 MockAdapter 进行了以下测试。但是我试图断言 get 函数已被有效调用,所以我创建了一个间谍。
由于某种原因,它似乎不起作用,我得到:
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
这是我的测试:
it('gets publications', async() => {
let spy = jest.spyOn(axios, "get");
var mock = new MockAdapter(axios);
mock.onGet(PUBLICATIONS_PATH + '/publications').reply(200,
{
answer: {
publications: [ "pub1", "pub2", "pub3" ]
}
});
let queryParameters = {
operation: 'FSale'
}
const publications = await PublicationService.getPublications(queryParameters);
expect(publications.data.answer.publications).toEqual([ "pub1", "pub2", "pub3" ]); // works fine
expect(spy).toHaveBeenCalled(); //This fails
})
我实际上是在尝试使用这种方法
更新:这是 getPublications
的代码async function _getPublications(queryParameters){
return await axios({
method: 'get',
url: `${PUBLICATIONS_PATH}/publications`,
cancelToken: CancelTokenService.getSource().token,
params: queryParameters,
headers: {
authorization: LocalStorageService.getAuthorization(),
'Accept': ResourcesVersions.PUBLICATION
}
}).then(function (response){ return response }).catch(function (error){ return (axios.isCancel(error) ? error : error.response) })
}
我不习惯在我的测试中使用 jest.spy
,但我认为你可以尝试类似的东西:
import axios from 'axios';
jest.mock('axios');
...
it('gets publications', async() => {
const get = axios.get.mockResolvedValueOnce(yourMockedData)
let queryParameters = {
operation: 'FSale'
}
const publications = await PublicationService.getPublications(queryParameters);
expect(publications.data.answer.publications).toEqual([ "pub1", "pub2", "pub3" ]); // works fine
expect(get).toHaveBeenCalled(); //This fails
})
在您提供的测试代码中,您正在监视 axios get
方法,但在 getPublications
方法中您没有调用该方法。相反,您直接调用 axios
方法。
由于监视 axios
默认方法并不容易,我建议更改 getPublications
中的代码以使用 get
方法:
async function _getPublications(queryParameters){
return await axios.get(`${PUBLICATIONS_PATH}/publications`, {
cancelToken: CancelTokenService.getSource().token,
params: queryParameters,
headers: {
authorization: LocalStorageService.getAuthorization(),
'Accept': ResourcesVersions.PUBLICATION
}
}).then(function (response){ return response }).catch(function (error){ return (axios.isCancel(error) ? error : error.response) })
}
您可以使用 https://github.com/ctimmerm/axios-mock-adapter#history 功能来检查已进行的实际调用并断言 URL、headers、方法和 what-else。