Модульное тестирование задач Ember-Concurrency и результаты

У нас есть много кода в нашем проекте, который не покрыт из-за задач параллелизма ember.

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

export default Controller.extend({
    updateProject: task(function* () {
        this.model.project.set('title', this.newTitle);
        try {
            yield this.model.project.save();
            this.growl.success('success');
        } catch (error) {
            this.growl.alert(error.message);
        }
    })
});```

person PercivalMcGullicuddy    schedule 18.10.2019    source источник


Ответы (1)


Вы можете выполнить модульное тестирование такой задачи, вызвав someTask.perform(). Для данной задачи вы можете заглушить то, что вам нужно, чтобы тщательно протестировать ее:

test('update project task sets the project title and calls save', function(assert) {

  const model = {
    project: {
      set: this.spy(),
      save: this.spy()
    }
  };
  const growl = {
    success: this.spy()
  };

  // using new syntax
  const controller = this.owner.factoryFor('controller:someController').create({ model, growl, newTitle: 'someTitle' });

  controller.updateProject.perform();

  assert.ok(model.project.set.calledWith('someTitle'), 'set project title');
  assert.ok(growl.success.calledWith('success'), 'called growl.success()');
});

Для этого используются шпионы из sinon и ember-sinon-qunit для доступа к sinon из тестового контекста, но это не обязательно для модульного тестирования. Вы можете заглушить модель, сервисы и т. д. утверждениями вместо шпионов:

const model = {
  project: {
    set: (title) => {
      assert.equal(title, 'someTitle', 'set project title');
    },
    save: () => {
      assert.ok(1, 'saved project');
    }
  }
};

Чтобы проверить улов, вы можете бросить из своего заглушенного метода model.project.save():

const model = {
  project: {
    ...
    save: () => throw new Error("go to catch!")
  }
};
person stevenelberger    schedule 18.10.2019