Javascript 如何使用Jest测试身份验证标头?
我正在尝试在执行api调用时测试auth标头:Javascript 如何使用Jest测试身份验证标头?,javascript,reactjs,unit-testing,ecmascript-6,jestjs,Javascript,Reactjs,Unit Testing,Ecmascript 6,Jestjs,我正在尝试在执行api调用时测试auth标头: import axios from 'axios'; import ApiClient from './apiClient'; import ApiService from './apiService'; jest.mock('./apiClient', () => { return { headers: { authorization: 'Bearer test token' }, get: jest.fn() }
import axios from 'axios';
import ApiClient from './apiClient';
import ApiService from './apiService';
jest.mock('./apiClient', () => {
return {
headers: { authorization: 'Bearer test token' },
get: jest.fn()
};
});
describe('apiService methods', () => {
beforeAll(() => {
ApiClient.get.mockImplementation((url: string) => {
return Promise.resolve({ data: mockData });
});
});
it('getArticles method call', () => {
ApiService.getArticles(jest.fn(), 1, 3, 'latest', 'news', 'selectedNews');
expect(axios.defaults.headers.common.Authorization).toBe(
'Bearer test token'
); // THIS GIVES UNDEFINED SO THE TEST FAILS
expect(ApiClient.get).toBeCalledWith(
'/content?type=article&page=1&limit=3&sort=latest&facet=news&article_category=selectedNews'
);
});
});
这是我在ApiClient
上请求标题的内容:
import axios from 'axios';
import envs from '../../config/index.json';
const client = axios.create({
baseURL: envs.data.data.centralApi.baseUrl + apiVersion
});
client.defaults.headers.common.Authorization = `Bearer ${localStorage.getItem(
`adal.access.token.key${envs.data.data.adal.clientId}`
)}`;
因此,我需要测试在执行api调用时,授权
头是否正确发送
我该怎么办?因为
ApiService.getArticles
是一个异步调用,所以应该在then
子句中设置期望值
例如:
it('getArticles method call', () => {
ApiService.getArticles(jest.fn(), 1, 3, 'latest', 'news', 'selectedNews').then(() => {
expect(axios.defaults.headers.common.Authorization).toBe(
'Bearer test token'
); // THIS GIVES UNDEFINED SO THE TEST FAILS
expect(ApiClient.get).toHaveBeenCalledWith(
'/content?type=article&page=1&limit=3&sort=latest&facet=news&article_category=selectedNews'
); // Note the use of "toHaveBeenCalledWith" instead of "toBeCalledWith"
});
});
如果您的项目支持ES6语法,您还可以使用async
/wait
:
it('getArticles method call', async () => {
await ApiService.getArticles(jest.fn(), 1, 3, 'latest', 'news', 'selectedNews');
expect(axios.defaults.headers.common.Authorization).toBe(
'Bearer test token'
); // THIS GIVES UNDEFINED SO THE TEST FAILS
expect(ApiClient.get).toHaveBeenCalledWith(
'/content?type=article&page=1&limit=3&sort=latest&facet=news&article_category=selectedNews'
);
});
您还可以在测试中使用类似于模拟HTTP请求的库
例如:
npm install --save-dev nock
如果标头不匹配,将抛出一个错误
最后一件事-当您使用jest.mock()
时,您实际上覆盖了正在导入的文件。它通常意味着用模拟方法覆盖导入文件中的特定方法。可能是通过覆盖apiClient
您没有到达设置默认axios
标题的代码行:
client.defaults.headers.common.Authorization = `Bearer ${localStorage.getItem(
`adal.access.token.key${envs.data.data.adal.clientId}`
)}`; // Not being reached because `apiClient` is being overriden
在那里放一个控制台日志,以确保你能到达那里
client.defaults.headers.common.Authorization = `Bearer ${localStorage.getItem(
`adal.access.token.key${envs.data.data.adal.clientId}`
)}`; // Not being reached because `apiClient` is being overriden