测试 Headers 的 Axios 请求
Testing Headers of Axios Request
我正在使用 Mocha + Chai 和 axios-mock-adapter 来测试我的 axios 请求。它运行良好,但我不知道如何通过 axios-mock-adapter test headers
of axios 并确保 Authorization
和 Content-type
是正确的!
export const uploadFile = (token: string, fileName: string, file: Buffer): Promise<string> => {
return new Promise((resolve, reject): void => {
const uploadFileURL = `xxxxx.com`;
axios
.put(uploadFileURL, file, {
headers: {
Authorization: `Bearer ${token}`,
"Content-type": "application/x-www-form-urlencoded",
},
})
.then((response): void => {
resolve(response.data.id);
})
.catch((error: Error): void => {
reject(error.message);
});
});
};
这是我的测试函数
describe("uploadFile", (): void => {
let mockAxios: MockAdapter;
beforeEach((): void => {
mockAxios = new MockAdapter(axios);
});
afterEach((): void => {
mockAxios.reset();
});
it("should return item's id", (done): void => {
const fileName: string = faker.system.fileName();
const token: string = faker.random.words();
const file: Buffer = Buffer.from(faker.random.words());
const expectedResult = {
id: faker.random.uuid(),
};
mockAxios.onPut(`xxxxx.com`).reply(200, expectedResult, {
Authorization: `Bearer ${token}`,
"Content-type": "application/x-www-form-urlencoded",
});
uploadFile(token, fileName, file)
.then((actualResult: string): void => {
// I want to test my header of my requests
expect(actualResult).to.equal(expectedResult.id);
done(); // done make sure we know when we run the test
})
.catch(done);
});
});
所以如果有人知道如何为 header 请求编写正确的测试,请帮助我。提前致谢!
现在唯一的方法是访问 .reply
中的请求 headers 并在此处验证它:
mockAxios.onPut(`xxxxx.com`).reply((config) => {
expect(config.headers."Content-Type").toEqual("What do you expect here");
return [200, expectedResult, {
Authorization: `Bearer ${token}`,
"Content-type": "application/x-www-form-urlencoded",
}];
});
其实我觉得声明式的也应该可以:
mockAxios.onPut(`xxxxx.com`, undefined, {
expectedHeader1: "value1",
expectedHeader2: "value2"}
).reply(200, expectedResult);
所以如果请求 headers 不匹配,它只会抛出而不是返回模拟响应。
但目前这种方式还行不通。
原因:axios-mock-adapter
使用 deepEqual
进行此类过滤。所以我们需要指定的不仅仅是少数必需的 headers(我们关注的是),而是 all headers 包括那些自己添加的 axios(比如 Accept
).所以它不是真正可读的。
我已经 filed #219 在他们的回购协议中。如果出于任何原因不是故意的,将来可能会修复。
@skyboyer 提到的声明方式适用于 objectContaining。
mockAxios.onPut(
`xxxxx.com`,
undefined,
expect.objectContaining({ expectedHeader1: "value1", expectedHeader2: "value2"})
).reply(200, expectedResult);
我正在使用 Mocha + Chai 和 axios-mock-adapter 来测试我的 axios 请求。它运行良好,但我不知道如何通过 axios-mock-adapter test headers
of axios 并确保 Authorization
和 Content-type
是正确的!
export const uploadFile = (token: string, fileName: string, file: Buffer): Promise<string> => {
return new Promise((resolve, reject): void => {
const uploadFileURL = `xxxxx.com`;
axios
.put(uploadFileURL, file, {
headers: {
Authorization: `Bearer ${token}`,
"Content-type": "application/x-www-form-urlencoded",
},
})
.then((response): void => {
resolve(response.data.id);
})
.catch((error: Error): void => {
reject(error.message);
});
});
};
这是我的测试函数
describe("uploadFile", (): void => {
let mockAxios: MockAdapter;
beforeEach((): void => {
mockAxios = new MockAdapter(axios);
});
afterEach((): void => {
mockAxios.reset();
});
it("should return item's id", (done): void => {
const fileName: string = faker.system.fileName();
const token: string = faker.random.words();
const file: Buffer = Buffer.from(faker.random.words());
const expectedResult = {
id: faker.random.uuid(),
};
mockAxios.onPut(`xxxxx.com`).reply(200, expectedResult, {
Authorization: `Bearer ${token}`,
"Content-type": "application/x-www-form-urlencoded",
});
uploadFile(token, fileName, file)
.then((actualResult: string): void => {
// I want to test my header of my requests
expect(actualResult).to.equal(expectedResult.id);
done(); // done make sure we know when we run the test
})
.catch(done);
});
});
所以如果有人知道如何为 header 请求编写正确的测试,请帮助我。提前致谢!
现在唯一的方法是访问 .reply
中的请求 headers 并在此处验证它:
mockAxios.onPut(`xxxxx.com`).reply((config) => {
expect(config.headers."Content-Type").toEqual("What do you expect here");
return [200, expectedResult, {
Authorization: `Bearer ${token}`,
"Content-type": "application/x-www-form-urlencoded",
}];
});
其实我觉得声明式的也应该可以:
mockAxios.onPut(`xxxxx.com`, undefined, {
expectedHeader1: "value1",
expectedHeader2: "value2"}
).reply(200, expectedResult);
所以如果请求 headers 不匹配,它只会抛出而不是返回模拟响应。
但目前这种方式还行不通。
原因:axios-mock-adapter
使用 deepEqual
进行此类过滤。所以我们需要指定的不仅仅是少数必需的 headers(我们关注的是),而是 all headers 包括那些自己添加的 axios(比如 Accept
).所以它不是真正可读的。
我已经 filed #219 在他们的回购协议中。如果出于任何原因不是故意的,将来可能会修复。
@skyboyer 提到的声明方式适用于 objectContaining。
mockAxios.onPut(
`xxxxx.com`,
undefined,
expect.objectContaining({ expectedHeader1: "value1", expectedHeader2: "value2"})
).reply(200, expectedResult);