глядя на ваш код в том виде, в котором он в настоящее время структурирован, вы не сможете не вызвать new MyWrapper
, потому что этот вызов выполняется внутри функции, которую вы вызываете. Скорее всего, вы захотите использовать внедрение зависимостей для передачи экземпляра MyWrapper
. Использование DI также позволит вам передавать макетированную версию вашего класса Wrapper для большего контроля над тестированием. Это может выглядеть примерно так:
// MyApp.js
const MyWrapper = require('MyWrapper');
const wrapper = new MyWrapper(process.env.username, process.env.password);
const process = async (message, wrapper) => {
// some business logic around the message...omitted
const data = wrapper.getFoo(message.id);
if(data) {
// do stuff with the data
wrapper.saveFoo(data);
} else {
console.log('no data found for message', message);
}
}
module.exports = { process }
Возможно, вы захотите создать экземпляр оболочки в другом месте, которое имеет смысл для вашего приложения, но на основе представленного вами кода это теперь позволит вам передать свой собственный тестируйте версию класса Wrapper при тестировании, например так:
// MyApp.spec.js
const sut = require('MyApp');
describe('MyApp', function(){
describe('process', function(){
it('should not call save when no data found', async function(){
// how do I prevent 'new MyWrapper(process.env.username, process.env.password)' from being called???
// how do I stub "wrapper.getFoo(message.id)" so I can return "undefined"
const msg = {......};
const wrapper = new MyWrapper();
await sut.process(msg, wrapper);
// now assert wrapper.getFoo was called
// now assert wrapper.saveFoo was *NOT* called
});
...
});
Вторая часть вашего вопроса касается создания заглушки класса с использованием sinon. Документация для sinon, найденная здесь здесь , вероятно, даст вам лучший пример того, как создать заглушку и вернуть ваше собственное значение из класса заглушки.
Надеюсь, это поможет!