我正在为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];
}
});
但是这种方法仅在我使用不同参数进行调用时有效。如果我不带任何参数拨打电话,我将不知道如何使响应多样化。