Как смоделировать модель 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 и почему мы должны делать это, пожалуйста, опубликуйте другой ответ, потому что мой код работает, но у меня все еще так много вопросов:/

Другие вопросы по тегам