Как смоделировать модель Sails.js / Waterline во время тестирования - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь смоделировать модель паруса с помощью 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 Ответ

0 голосов
/ 26 февраля 2019

Я понял это, но я все еще не могу сказать, как это работает и как это должно быть проверено (корректно)

Проблема с моим кодом была: только последняя функция, вызванная в цепочке "async ", поэтому, когда имитируете это, только fetch должно быть async

Вот мой тестовый код

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, mock должен выглядеть следующим образом:

const objectCreateStub = sandbox.stub(Object, 'create').callsFake(async function(data) {  // here fake function MUST BE async
  console.log(data)
});

Если вы понимаете, как работают ватерлиновые запросы и почему мы должны делать этот обходной путь, пожалуйста, опубликуйте другой ответ, потому что мой код работает, но у меня все еще так много вопросов: /

...