原文地址:https://www.npmjs.com/package/axios-mock-adapter Axios adapter,一个更容易的模拟请求
一、安装 1、使用npm: $ npm install axios-mock-adapter –save-dev 2、使用cdn https://unpkg.com/axios-mock-adapter/dist/axios-mock-adapter.js https://unpkg.com/axios-mock-adapter/dist/axios-mock-adapter.min.js 3、也可以使用browser,要求axios在v0.9.0以及以上 二、例子 1、模拟一个GET请求
var axios = require('axios'); var MockAdapter = require('axios-mock-adapter'); // 定义一个mock adapter实例 var mock = new MockAdapter(axios); // 模拟GET请求 // arguments for reply are (status, data, headers) mock.onGet('/users').reply(200, { users: [ { id: 1, name: 'John Smith' } ] }); axios.get('/users') .then(function(response) { console.log(response.data); });2、模拟一个带特定参数的GET请求
var axios = require('axios'); var MockAdapter = require('axios-mock-adapter'); var mock = new MockAdapter(axios); // arguments for reply are (status, data, headers) mock.onGet('/users', { params: { searchText: 'John' } }).reply(200, { users: [ { id: 1, name: 'John Smith' } ] }); axios.get('/users', { params: { searchText: 'John' } } ) .then(function(response) { console.log(response.data); });3、给相应加一个延迟,单位是毫秒
//这个实例的所有请求都会有一个2s的延迟 var mock = new MockAdapter(axiosInstance, { delayResponse: 2000 });4、还原原始的adapter(将会移除模拟行为)
mock.restore();也可以通过reset重置注册过的模拟操作
mock.reset();reset、restore两者是不同的,restore从axios实例中彻底移除了模拟行为,reset仅仅移除了添加在onGet、onPost所有模拟操作 5、reply函数
mock.onGet('/users').reply(function(config) { // `config`是axios的配置项包含的有url // return an array in the form of [status, data, headers] return [200, { users: [ { id: 1, name: 'John Smith' } ] }]; });6、使用正则
mock.onGet(/\/users\/\d+/).reply(function(config) { // the actual id can be grabbed from config.url return [200, {}]; });7、没有指定的路径匹配
// 状态码500拒绝所有的post请求 mock.onPost().reply(500);8、链式操作也是被支持的
mock .onGet('/users').reply(200, users) .onGet('/posts').reply(200, posts);9、.replyOnce() 模拟只相应一次
mock .onGet('/users').replyOnce(200, users) //第一个请求完成之后,这个操作就会被移除 .onGet('/users').replyOnce(500); //第二个请求将会出现500错误 //接下来的任何请求都会返回404错误, 因为没有匹配的操作存在10、模拟任何给定url的请求
// mocks GET, POST, ... requests to /foo mock.onAny('/foo').reply(200);11、.onAny可以用在想要测试一个给定顺序的系列请求
// 期望的请求顺序: const responses = [ ['GET', '/foo', 200, { foo: 'bar' }], ['POST', '/bar', 200], ['PUT', '/baz', 200] ]; // 匹配所有请求 mock.onAny().reply(config => { const [method, url, ...response] = responses.shift(); if (config.url === url && config.method.toUpperCase() === method) return response; // Unexpected request, error out return [500, {}]; });12、reply函数也可以返回一个Promise
mock.onGet('/product').reply(function(config) { return new Promise(function(resolve, reject) { setTimeout(function() { if (Math.random() > 0.1) { resolve([200, { id: 4, name: 'foo' } ]); } else { // reject() reason will be passed as-is. // Use HTTP error status code to simulate server failure. resolve([500, { success: false } ]); } }, 1000); }); });13、多个请求
var normalAxios = axios.create(); var mockAxios = axios.create(); var mock = MockAdapter(mockAxios); mock .onGet('/orders') .reply(() => Promise.all([ normalAxios .get('/api/v1/orders') .then(resp => resp.data), normalAxios .get('/api/v2/orders') .then(resp => resp.data), { id: '-1', content: 'extra row 1' }, { id: '-2', content: 'extra row 2' } ]).then( sources => [200, sources.reduce((agg, source) => agg.concat(source))] ) );