Я пытаюсь выполнить модульное тестирование маршрута восстановления, который возвращает объект S3 из корзины
мой маршрут:
module.exports = function(server) {
server.get('/configs/:version', (req, res, next) => {
const s3 = new AWS.S3();
const params = {
Bucket: 'testBucket',
Key: 'testKey'
};
function send(data, next) {
res.setHeader('Content-Type', 'text/plain');
res.setHeader('Cache-Control', 'no-cache');
res.status(200);
res.send(data.Body);
next();
}
s3.getObject(params, (err, data) => (err) ? next(err) : send(data, next));
});
};Для своего модульного теста я пытался издеваться над конструктором S3, чтобы я мог заглушить getObject, и терпел неудачу.
describe('#configs', () => {
let req;
let res;
let next;
let server;
let config;
let AWS;
let S3;
let route;
beforeEach(() => {
req = {
params: {
version: 'testVersion'
}
};
res = {
send: sinon.spy(),
};
next = sinon.spy();
server = {
get: sinon.stub(),
};
config = {
get: sinon.stub(),
}
AWS = () => {
return {
S3: () => {
return {
getObject: sinon.stub()
}
}
}
}
route = proxyquire(process.cwd() + '/lib/routes/configs/get', {
'configs.js': config,
'aws-sdk': AWS,
});
route(server);
});
describe('#GET', () => {
it('Should register configs get route', () => {
let s3 = sinon.createStubInstance(AWS.S3, {
getObject: sinon.stub(),
});
server.get.callArgWith(1, req, res, next);
expect(server.get).calledOnce.calledWith('/configs/:version');
expect(s3.getObject).calledOnce.calledWith({
Bucket: 'testBucket',
Key: 'testKey'
});
});
});
});Но я получаю эту ошибку:
TypeError: undefined is not a spy or a call to a spy! в методе getObject.
После чтения документов sinon снова и снова я не могу понять, как издеваться над конструктором, как я могу заглушить метод getObject, чтобы я мог убедиться, что он вызывается правильно, и он возвращается, поэтому я знаю, что ответы обрабатываются правильно Может кто-нибудь помочь мне с этим?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Наконец, мои макеты заработали, проблема заключалась в том, что я издевался над AWS, поскольку функция не имеет объекта, это S3, который нужно смоделировать как функцию, потому что это S3, который нужно создать. Вот как должен выглядеть макет:
function S3() {
return s3;
}
s3 = {
getObject: sinon.stub(),
putObject: sinon.stub()
};
AWS = {
config: {
update: sinon.stub()
},
S3: S3
};
Таким образом, если нужно имитировать putObject, ему просто нужно, например, сделать это: s3.putObject.callsArgWith (1, ошибка, данные);
Да, этот код не работает. Подправлю ответ.
TypeError: AWS.S3 не является конструктором
Помните, что вы не должны создавать экземпляры в своих тестах, он уже создается в вашем коде, на самом деле вы хотите имитировать методы того же экземпляра. Но все равно этот код не отражает мое окончательное решение, я исправлю ...
Я пробовал приведенный выше код, но он не работает. Вы можете вкратце привести пример?