Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Jest测试身份验证标头?_Javascript_Reactjs_Unit Testing_Ecmascript 6_Jestjs - Fatal编程技术网

Javascript 如何使用Jest测试身份验证标头?

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() }

我正在尝试在执行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()
  };
});

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