axios-mock-adapter

来源:互联网 发布:淘宝银泰百货旗舰店 编辑:程序博客网 时间:2024/06/15 00:36

原文地址: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))]    )  );
0 0
原创粉丝点击