Вспомогательный метод заглушки Sinon, определенный в том же файле

Итак, у меня есть файл user-database, который выглядит примерно так:

export function foo(id: number): Promise<boolean> {
  return new Promise<boolean>((resolve, reject) => {
    findSomething(id)
    .then((data) => {
      //do something with data
    })
  }
}

export function findSomething(id: number): Promise<Object> {
  return new Promise<Object> ((resolve, reject) => {
    let query = 'SELECT * FROM user';
    db.executeQuery(query);
    .then(data) => {
      if(data.length < 1) { reject(new Error('whoops')); }
      resolve(data);
    }, (err) => {
      reject(err);
    })
  })
}

Итак, я пишу модульные тесты, используя Sinon для внешней функции foo, и поэтому я хочу заглушить вызываемую ею функцию findSomething. Я делаю это следующим образом:

import * as user_db from '../../src/user-database';

describe('POST /someEndpoint', () => {
  describe('when successful', () => {
    let stub;

    beforeEach(function() {
      stub = sinon.stub(user_db, 'findSomething');
    });

    afterEach(function() {
      stub.restore();
    }); 

    it('should respond with 200', function(done) {
      stub.returns(anObjectIPredefine);

      request(server)
        .post(basePath)
        .send(aPayloadIPredefine)
        .expect(200, done);
    });
  }
}

Когда я запускаю тест, я не вижу объект, который я говорю заглушке вернуть с этим stub.returns(anObjectIPredefine). Вместо этого я выполняю функцию findSomething как обычно и получаю данные из дБ. Есть ли что-то очевидное, что я делаю неправильно? Мое единственное предположение состоит в том, что stub = sinon.stub(user_db, 'findSomething') не является правильным синтаксисом для заглушки функции, определенной в той же области видимости, что и тестируемая функция. Однако я не могу найти альтернативный синтаксис.


person TovrikTheThird    schedule 15.12.2016    source источник


Ответы (1)


Итак, в итоге я переместил функции, которые хотел заглушить, в другой файл. Когда это сделано, заглушка работает как задумано. Вероятно, не лучшее решение, но определенно быстрое решение для тех, кто находится в подобной ситуации.

person TovrikTheThird    schedule 07.02.2017