测试action2控制器的存根action2助手路由响应超级测试

时间:2018-12-07 14:47:52

标签: sails.js sinon supertest

我在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);
  });
});

然后我读了the official doc helper page,我们应该使用exitsintercept来正确处理 Sails.js 1 上来自助手的错误。

因此,我已将action2和helper重写为用法,并得到下一个

具有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控制器是否阻止真正的助手调用是有问题的,这是因为当我们使用下一个链接调用对助手方法进行存根时会出错,但是如果没有这些调用,我们将无法为用户推荐错误处理。

虽然我没有使用链式机器方法(tolerateintercept等),但所有测试均成功通过,但是当我影响它时,我得到了一个错误。

错误

  

错误:正在发送500(“服务器错误”)响应:    TypeError:sails.helpers.someHelper(...)。intercept不是函数

如果有人想尝试一些想法,我已经准备好a repo on GitHub

回购标签

  1. 无链式帮助方法的正确测试结果-无反向测试
  2. 带有链方法的破损测试-破损测试。

Here is a related question,但用于 Sails.js 0.12.14-

任何想法如何避免此问题?我将不胜感激。

0 个答案:

没有答案