我在Sails.js 1上有一个项目
我尝试在开发中使用TDD,因此添加了路由测试。为了防止在助手中进行真正的API调用,我通过 sinon
所以我可以使用此代码成功通过测试
module.exports = {
friendlyName: 'Some action',
description: '',
inputs: {
requiredParam: {
example: 'some_value',
required: true,
type: 'string',
}
},
exits: {
someError: {
description: 'Handles some error happens in controller',
message: 'Some error handled in controller',
}
},
fn: async function (inputs, exits) {
const someProcesses = await sails.helpers.someHelper(inputs.requiredParam);
if (someProcesses === 'someError') {
exits.someError(someProcesses);
} else {
exits.success(someProcesses);
}
}
};
module.exports = {
friendlyName: 'Some helper',
description: '',
inputs: {
requiredParam: {
example: 'some_value',
required: true,
type: 'string',
}
},
exits: {
someError: {
description: 'Just some error happens in workflow',
message: 'Some error happens!',
}
},
fn: async function (inputs, exits) {
// All done.
return inputs.requiredParam === 'isError' ? exits.success('someError') : exits.success('someProcessedValue');
}
};
const request = require('supertest');
const {createSandbox} = require('sinon');
describe('GET /some-page/some-action', () => {
before(() => {
this.sandbox = createSandbox();
this.sandbox.stub(sails.helpers, 'someHelper')
.withArgs('some_value').returns('someProcessedValue')
.withArgs('isError').returns('someError');
});
after(() => {
this.sandbox.restore();
});
it('should response OK', async () => {
await request(sails.hooks.http.app)
.get('/some-page/some-action')
.query({requiredParam: 'some_value'})
.expect(200);
});
it('should response with error', async () => {
await request(sails.hooks.http.app)
.get('/some-page/some-action')
.query({requiredParam: 'isError'})
.expect(500);
});
});
然后我读了the official doc helper page,我们应该使用exits
和intercept
来正确处理 Sails.js 1 上来自助手的错误。>
因此,我已将action2和helper重写为用法,并得到下一个
module.exports = {
friendlyName: 'Some action',
description: '',
inputs: {
requiredParam: {
example: 'some_value',
required: true,
type: 'string',
}
},
exits: {
someError: {
description: 'Handles some error happens in controller',
message: 'Some error handled in controller',
}
},
fn: async function (inputs, exits) {
const someProcesses = await sails.helpers.someHelper(inputs.requiredParam)
.intercept('someError', exits.someError);// Error happens here
return exits.success(someProcesses);
}
};
我注意到这对于测试action2控制器是否阻止真正的助手调用是有问题的,这是因为当我们使用下一个链接调用对助手方法进行存根时会出错,但是如果没有这些调用,我们将无法为用户推荐错误处理。
虽然我没有使用链式机器方法(tolerate
,intercept
等),但所有测试均成功通过,但是当我影响它时,我得到了一个错误。
错误:正在发送500(“服务器错误”)响应: TypeError:sails.helpers.someHelper(...)。intercept不是函数
如果有人想尝试一些想法,我已经准备好a repo on GitHub。
Here is a related question,但用于 Sails.js 0.12.14-
任何想法如何避免此问题?我将不胜感激。