У меня есть проект на Sails.js 1
Я пытаюсь использовать TDD при разработке, поэтому я добавил тестирование маршрута.Чтобы предотвратить настоящий вызов API в помощниках, я издевался над ними через sinon
, поэтому я могу успешно пройти тесты с этим кодом
код контроллера action2
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);
});
});
Затем я прочитал на официальной странице помощника документа , что мы должны использовать exits
иintercept
для правильной обработки ошибок от помощников на Sails.js 1 .
Итак, я переписал свой action2 и помощник для его использования и получил следующий
контроллер Action2с обработкой перехвата action2
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 (...). Перехват не является функцией
Я подготовил репозиторий на GitHub , если кто-то хочет попробовать какую-то идею.
Теги репо
- correct-test-result-with-chained-helper-методов - тесты без реверса
- неработающие тесты с цепочкой-методами - неработающие тесты.
Вот связанный с этим вопрос , но это для Sails.js 0.12.14-
Есть идеи, как избежать этой проблемы?Буду признателен за любой ответ.