Модульное тестирование заданий и выходов на задний план - PullRequest
1 голос
/ 18 октября 2019

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

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

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);
        }
    })
});```

1 Ответ

2 голосов
/ 18 октября 2019

Вы можете выполнить такое тестовое задание, вызвав 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!")
  }
};
...