javascript - 如何用 Jest 测试授权 header ?

标签 javascript reactjs unit-testing ecmascript-6 jestjs

我正在尝试在进行 api 调用时测试 auth header :

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 上用来请求 header 的内容:

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 调用时 Authorization header 是否正确发送。

我该怎么办?

最佳答案

由于 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/await:

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'
    );

});

您还可以使用类似 nock 的库在测试中模拟 HTTP 请求。

例如:

npm install --save-dev nock
import nock from 'nock';
// ...your other imports

const baseUrl = 'https://some-base-url.com';
const mockRequest = nock(baseUrl);

describe('apiService methods', () => {

  it('getArticles method call', () => {
    const url = "/content?type=article&page=1&limit=3&sort=latest&facet=news&article_category=selectedNews";

    mockRequest.matchHeader('Authorization', 'Bearer test token').get(url).reply(200, '');

    ApiService.getArticles(jest.fn(), 1, 3, 'latest', 'news', 'selectedNews').then(function (response) { 
        expect(response).to.equal('');
    }).catch((error) => {
        console.log('Incorrect header:', error);
    });

  });

});

如果 header 不匹配,将抛出错误。

最后一件事 - 当您使用 jest.mock() 时,您实际上是在覆盖正在导入的文件。它通常意味着用模拟方法覆盖导入文件中的特定方法。可能是通过覆盖 apiClient 你没有到达设置默认 axios header 的代码行:

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

将控制台登录到那里以确保您到达那里。

关于javascript - 如何用 Jest 测试授权 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58399770/

相关文章:

javascript - 如何映射包含另一个我想要映射的对象并从中返回 JSX 的对象?

java - 导入顺序似乎对编译成功很重要?

javascript - 从 p 标签中删除文本并使用 jquery 添加一个类

javascript - 应用 css 样式时,knockout.js 可见性不起作用

javascript - 如何在 Electron.net 中接收多个参数

javascript - jQuery Remove 方法出错

javascript - 如何避免在 React 上遍历?

reactjs - GKE 上的单个 LoadBalancer 中的多个 React 应用程序

javascript - 为什么 Qunit 无法捕获我正在运行的 2 个以上测试?

unit-testing - 使用 enzyme react 测试组件WillReceiveProps