Остановка вызова класса из другой функции - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть 2 файла controller.js и entity.js, которые взаимодействуют друг с другом.Я тестирую controller.js, и он создает экземпляр entity.js (class) и использует одну из его функций.Как я могу заглушить / смоделировать / шпионить вызов и возврат этого метода?

controller.js

const controller= async (req, res) => {

try {
    ...

    const entity = new Entity({
    ...
    });

    const validation = await entity.validate();

    ...
    return res.send()
    }
  } catch (error) {
    return res.send(error)
  }
};

Entity.js

class Entity{
  constructor() {
  ...
  }

  ...

  async validate() {
    ...
    return response;
  }
}

Любая идея, какпротестировать controller.js, используя supertest, sinon и chai?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Это решение использует Ava (но вы должны легко адаптироваться к Mocha).Однако я больше знаком с testdouble.Если у вас нет успеха с sinon (я уверен, что у вас это получится), вот альтернативный вариант, который вы можете рассмотреть.

Итак, если у нас есть burrito.js:

module.exports = class {
   eat() {
      return '?';
   }
};

Иlunch.js:

var Burrito = require('./burrito');
module.exports = () => (new Burrito()).eat();

Затем в вашем тесте:

const td = require('testdouble');
const test = require('ava');

test('swap burrito', t => {

  td.replace('./burrito', class FakeBurrito  {
    eat() {
      return '?';
    }
  });

  const lunch = require('./lunch');

  t.is(lunch(), '?'); // PASS
  t.is(lunch(), '?'); // FAIL
});

Ключ должен требовать вашей зависимости (буррито), прежде чем ваш испытуемый (ваш обед) требует этого,так что у вас есть время подделать его.

0 голосов
/ 16 ноября 2018

Синон с радостью заглушит функцию. Поскольку это метод класса, вам просто нужно заглушить функцию в прототипе:

const controller = async (req, res) => {
      const entity = new Entity();
      const validation = await entity.validate();
      console.log(validation)
  };
  
class Entity{
    constructor() {}
    async validate() {
      return "real function";
    }
}
// stub it
let stub = sinon.stub(Entity.prototype, 'validate')
stub.returns('stubbed function')

controller()
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.1.1/sinon.min.js"></script>
...