如何在 TypeScript 中使用 mocha 模拟 axios 依赖项?

Posted

技术标签:

【中文标题】如何在 TypeScript 中使用 mocha 模拟 axios 依赖项?【英文标题】:How to mock axios dependency using mocha in TypeScript? 【发布时间】:2020-12-03 20:13:39 【问题描述】:

这是我的示例 src/main.ts 文件

import axios from 'axios';
export async function main() 
     const URL = 'test url';
     const secretKey = 'Test key'
     const response = await axios.get(URL, 
        headers:  'Content-Type': 'application/json', 'KEY': secretKey ,
    );

我想使用 mocha 在 spec/test.ts 文件中编写我的测试用例。有人可以告诉我如何为 axios 依赖项创建一个模拟和存根。

【问题讨论】:

moxios 有帮助吗? 不,我想改用依赖注入和mocha。 你需要一个像sinonjs这样的模拟/存根库。如果您不想使用任何额外的软件包。像function main(httpClient) 这样重构您的代码,而不是使用import,然后您可以创建您的模拟httpClient 并将其传递给main 函数。 【参考方案1】:

对于typestript中的模拟/存根axios,我推荐axios-mock-adapter,对于expect函数chai

这是一个如何做到这一点的例子

request.ts

import axios from 'axios';

const apiConfig = 
    returnRejectedPromiseOnError: true,
    timeout: 30000,
    headers: 
        common: 
            'Content-Type': 'application/json',
            'Accept': 'application/json',
        ,
    ,
;

const request = axios.create(apiConfig);
export default request;

main.ts

import request from './request';

export const URL = 'https://httpbin.org/get';
export const secretKey = 'secret_key';

export async function main() 

    const response = await request.get(URL, 
        headers: 
            KEY: secretKey,
        ,
    );

    // response logic

    return response;

main.spec.ts

import MockAdapter from 'axios-mock-adapter';
import  expect  from 'chai';

import request from './request';
import  main, URL, secretKey  from './main';


describe('Request test', () => 
    let stub: MockAdapter;
    const receivedData =  data: 'data' ;

    before(() => 
        stub = new MockAdapter(request);
        stub.onGet(URL, 
            headers: 
                KEY: secretKey,
            ,
        ).replyOnce(200, receivedData);
        // replyOnce if you assume that your code sends a single request
    );

    it('test', async () => 
        const response = await main();

        expect(response.status).to.be.equal(200);
        expect(response.data).to.be.deep.equal(receivedData);
    );

    after(() => 
        stub.restore();
    );
);

【讨论】:

以上是关于如何在 TypeScript 中使用 mocha 模拟 axios 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行用 TypeScript 编写的 Mocha 测试?

如何在没有冲突的情况下将 Mocha 和 Jest 与 TypeScript 一起使用?

Mocha + TypeScript:不能在模块外使用导入语句

如何使用 Visual Studio Code 中的 Mocha 调试 Typescript 编写的单元测试

使用 Mocha 和 Typescript 模拟依赖项

使用 Typescript 在 Mocha 测试中使用 Mockery 有技巧吗?