Итак, у меня есть файл 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')
не является правильным синтаксисом для заглушки функции, определенной в той же области видимости, что и тестируемая функция. Однако я не могу найти альтернативный синтаксис.