Stub action2 helper при тестировании action2 контроллера трассы ответа supertest - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть проект на 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 , если кто-то хочет попробовать какую-то идею.

Теги репо

  1. correct-test-result-with-chained-helper-методов - тесты без реверса
  2. неработающие тесты с цепочкой-методами - неработающие тесты.

Вот связанный с этим вопрос , но это для Sails.js 0.12.14-

Есть идеи, как избежать этой проблемы?Буду признателен за любой ответ.

...