如何模拟您正在测试的类的内部公理实例



我正在使用Jest测试一个客户端类,该类内部使用axios。它公开了接触API并调用其端点的方法。客户端在类的构造函数中初始化,并且需要一个API键。这里有一个例子:

export class ExampleClient {
private client: AxiosInstance;
private defaultCountry: Countries;
private defaultLanguage: Languages;
constructor(config: Config) {
const { apiKey, defaultCountry, defaultLanguage } = config;
this.defaultCountry = defaultCountry || Countries.USA;
this.defaultLanguage = defaultLanguage || Languages.English;
this.client = axios.create({
baseURL: 'https://example-api.com',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': apiKey,
},
});
}
}

现在,我不想在这里使用真正的API密钥,但我仍然希望能够检查该密钥是否正确地附加到头部,并查看是否正确地调用了端点。我还想测试映射,因为客户端还将端点响应映射到更可读的对象。

如果这个问题已经在另一个线程中得到解决,我很抱歉,但我似乎什么都找不到。

您可以模拟;axios";带着嘲弄的玩笑。您可以测试是否已接收标头以及是否已设置标头。

一个例子:

// axios.test.ts
import { Test } from "./Test";
jest.mock("axios");
describe("Axios", () => {
it("test axios", () => {
let headerExpected: { content: string } = { content: "nothing" };
// implementation of axios.create
const mockAxios = jest.requireMock("axios");
mockAxios.default.create = jest
.fn()
.mockImplementation((props: { headers: { content: string } }) => {
headerExpected = props.headers;
});
const test = new Test();
test.test1({ content: "test" });
expect(headerExpected.content).toEqual("test");
});
});

// Test.ts
import * as axios from "axios";
export class Test {
private client!: axios.AxiosInstance | undefined;
test1(header: { content: string }): void {
this.client = axios.default.create({
headers: header,
});
}
}

但是,也许这种类型的测试没有给你足够的价值。

问候!

我四处窥探,发现了这个名为'axios-mock-adapter'-link的包。之后,我通过使用方括号访问私有客户端对象,将其传递给适配器。这让我可以自由地检查通过适配器的请求的历史记录,也可以配置响应。这里有一个例子:

import MockAdapter from 'axios-mock-adapter';
it('should set API key in request header', async () => {
const sdk = new ExampleClient({ apiKey: 'test_api_key' });
const adapter = new MockAdapter(sdk['client']);
adapter.onGet('/search').reply(200, { results: [], total_results: 0 });
await sdk.search('test_value');
const lastRequest = adapter.history.get[0];
expect(lastRequest.headers).toBeDefined();
expect(lastRequest.headers?.['X-Api-Key']).toEqual('test_api_key');
});

希望这能帮助到别人!

最新更新