【发布时间】:2020-03-13 04:24:02
【问题描述】:
我是测试新手,对使用 ES6 类模拟 API 和 axios 实例有一些疑问。
我有一个index.js:
import axios from 'axios';
export default class Pushkin {
constructor() {
this.con = undefined;
}
connect(quizAPIUrl) {
this.con = axios.create({
baseURL: quizAPIUrl,
});
}
prepExperimentRun(userID) {
const postData = {
user_id: userID,
};
return this.con.post('/startExperiment', postData);
}
// ......
}
我尝试了几种方法来测试它:
import axios from 'axios';
import Pushkin from '../src/index';
jest.mock('axios');
const quizURL = './api/quiz';
axios.create.mockImplementation(() => Promise.resolve(quizURL));
const pushkinClient = new Pushkin();
test('connect to quiz api url', () => {
pushkinClient.connect(quizURL);
// Pushkin { con: Promise { './api/quiz' } }
pushkinClient.con.then((data) => expect(data).toEqual(quizURL));
});
test('prepExp', () => {
const postData = { data: [{ user_id: 123456 }] };
axios.post.mockImplementation(() => Promise.resolve(postData));
pushkinClient.prepExperimentRun(123456).then((data) => expect(data).toBe(postData));
});
当我运行第二个测试prepExp 时,它会抛出错误TypeError: this.con.post is not a function。而this.con 就是Promise { './api/quiz' }。
我应该如何模拟connect(quizAPIurl) 中的quizAPIurl 而不仅仅是硬编码?之后,模拟 axios 实例和测试 POST 请求的正确方法是什么?谢谢。
【问题讨论】:
-
我不会测试 axios'
post()- 可以肯定地假设它可以正常工作。不过,测试post()是否使用正确的参数调用是有效的。 -
@Yorkshireman 您能否更具体地说明我该怎么做?谢谢!
-
jestjs.io/docs/en/mock-functions.html
expect(mockCallback.mock.calls[0][0]).toBe(42);之类的东西(calls[0][0]就是你所说的mockCallback()——特别是第一次调用的第一个参数)
标签: javascript jestjs axios