Как смоделировать модель Sails.js / Waterline во время тестирования
Я пытаюсь смоделировать модель паруса с помощью sinon.js. У меня проблема при тестировании той части, где я использую .fetch()
рядом Model.create()
чтобы получить вновь созданную строку.
Вот мой код, который я хочу издеваться:
...
let newObject = await Object.create(newObjectData).fetch();
...
Вот мой тестовый код
const sinon = require('sinon');
const supertest = require('supertest');
describe('Object create action', function() {
let sandbox;
beforeEach(function() {
sandbox = sinon.createSandbox();
});
afterEach(function() {
sandbox.restore();
});
it('should create Object', function(done) {
const objectCreateStub = sandbox.stub(Object, 'create').callsFake(async function(data) {
console.log(data);
return {
key: 'value'
};
});
supertest(sails.hooks.http.app)
.post(`/objects`)
.send({
key: 'value'
})
.expect(200)
.end(done);
});
});
Я понятия не имею, что Object.create
поддельная функция должна вернуться для того, чтобы .fetch
не выбросить ошибку. Итак, как и ожидалось, я получаю эту ошибку:
TypeError: Object.create(...).fetch is not a function
Какой объект делает Model.create()
возвращается, чтобы я тоже мог издеваться? Есть ли лучшая практика для тестирования с Sails и Waterline?
Спасибо!
1 ответ
Я понял это, но я все еще не могу сказать, как это работает и как это должно быть проверено (правильно)
Проблема с моим кодом заключалась в том, что только последняя функция, вызванная в цепочке, является "асинхронной", поэтому при ее использовании только fetch
должен быть асинхронным
Вот мой тестовый код
const objectCreateStub = sandbox.stub(Object, 'create').callsFake(function (data) { // Notice here fake function IS NOT async
console.log(data
return {
fetch: async () => { // Here we "mock" the fetch function and it MUST be async !
return newTest
}
};
});
И если вы не используете fetch
Макет должен выглядеть так:
const objectCreateStub = sandbox.stub(Object, 'create').callsFake(async function(data) { // here fake function MUST BE async
console.log(data)
});
Если вы понимаете, как работают запросы Waterline и почему мы должны делать это, пожалуйста, опубликуйте другой ответ, потому что мой код работает, но у меня все еще так много вопросов:/