根据Axios的输入模拟不同的api响应

时间:2018-07-10 09:22:41

标签: javascript mocking axios

我正在为Vuejs应用程序构建一些e2e测试。 我正在使用的框架是Nightwatch和http库Axios(以及用于模拟的相对插件:Axios-mock-adapter),而我当前的过程是拥有一个拦截所有api的文件以及一个返回响应的文件对象:

例如,如果我想模拟/api/sources

mock.onGet(/my.url\/api\/sources/).reply(() =>
  [200, ResponseObject.getSources],
);

在响应对象文件中,我有:

const getSources = {
  files: [
    {
      id: 'bogus',
      fileName: 'bogus',
      fileUrl: 'http://bogus.com/1',
      size: 400,
      uploadedTime: '2018-05-24 10:56:27',
      sourceContact: 'boguscontact',
      isFolder: false,
    }, {
      id: 'bogus2',
      fileName: 'bogus 2',
      fileUrl: 'http://bogus.com/2',
      size: 500,
      uploadedTime: '2018-05-24 10:56:27',
      sourceContact: 'boguscontact',
      isFolder: false,
    }, {
      id: 'bogus3',
      fileName: 'bogus 3',
      fileUrl: 'http://bogus.com/3',
      size: 600,
      uploadedTime: '2018-05-24 10:56:27',
      sourceContact: 'boguscontact',
      isFolder: false,
    },
  ],
};

通过此设置,我遇到了一个非常烦人的问题:

有时候,我必须通过相同的api调用返回不同的对象,例如,如果文件具有属性ready,并且我想测试用户流以准备文件,那么我需要返回第一次使用ready: false创建文件,然后添加一些参数,然后必须使用ready: true返回文件。我该怎么办?

另一个例子是获取单个源文件。我有相同的api调用api/source/:sourceId,但是当源代码为ready: true时,如果源代码为ready: false,则需要更多参数进行比较,但是我不知道如何在没有源代码的情况下模拟该行为后端。

现在我唯一能做的就是根据查询参数做出不同的响应:

mock.onGet(/dmd\.mocked\/api\/files/).reply((config) => {
  if (typeof config.params !== 'undefined') {
    switch (config.params.status) {
      case 'queued':
        return [200, ResponseObject.queuedFilesList];
      case 'processing':
        return [200, ResponseObject.processingFilesList];
      default:
        return [506];
    }
  } else {
    return [200, ResponseObject.queuedFilesList];
  }
});

但是这种方法仅在我使用不同参数进行调用时有效。如果我不带任何参数拨打电话,我将不知道如何使响应多样化。

0 个答案:

没有答案