Как я могу добавить свойства к компоненту в модульном тесте перед инициализацией?

Я работаю над компонентом Ember с функцией инициализации, для которой я хотел бы добавить модульный тест. Компонент имеет следующие свойства:

1) Функция инициализации не должна запускаться более одного раза, и

2) Компонент зависит от того, передана ли ему модель (currentUser).

До сих пор я пытался написать такой тест:

test('#init', function(assert) {
  const component = this.owner.lookup('component:component-that-depends-on-property');

  const currentUser = make('user');
  component.set('currentUser', user);

  component.init();

  assert.ok(component.somethingHasHappened);
});

Моя проблема в том, что метод init запускается в строке owner.lookup, а это означает, что у меня нет возможности получить currentUser в компоненте до его запуска. Опять же, я не могу запустить метод init более одного раза, не взорвав состояние компонента.

Я заметил, что метод поиска принимает аргумент options, и подумал, что смогу использовать его для передачи currentUser, но, похоже, это не работает, и я не смог найти много документации по методу поиска.

Я бы хотел избежать написания интеграционного теста для этого, если это возможно. Есть ли хороший способ сделать это/обходной путь, которого я не вижу?


person Glyoko    schedule 01.10.2019    source источник
comment
Я бы рекомендовал тестировать компоненты с помощью интеграционных тестов, которые отображают компонент. В противном случае вы тестируете не общедоступный API этого компонента, а детали реализации. Вы столкнулись с одной из этих проблем, вызванных этим.   -  person jelhan    schedule 02.10.2019
comment
Можете ли вы объяснить, почему The init function must not be run more than once?   -  person bartocc    schedule 03.10.2019
comment
Просто так оно устроено. Это старый и массивный код, который сейчас слишком сложен для рефакторинга. Планирую исправить это, но я хотел бы провести тесты, прежде чем работать над этим. Я бы очень хотел, чтобы он был идемпотентным. Своеобразная мотивация для начала.   -  person Glyoko    schedule 03.10.2019


Ответы (2)


Я бы предложил написать интеграционные тесты для компонентов. Избегайте написания сценариев модульного тестирования для компонентов, а пишите сценарии модульного тестирования для контроллеров, примесей, моделей, маршрутов, сервисов.

person prat_bhan    schedule 02.10.2019
comment
Можете ли вы дать ссылку на что-то, объясняющее, почему? Статья? Я не видел ничего, что рекомендовало бы компоненты модульного тестирования. - person Glyoko; 02.10.2019
comment
Когда вы создаете новый компонент, вместе с ним создается интеграционный тест, так как это рекомендуемый способ их тестирования. См. Тестирование компонентов в руководствах по EmberJS здесь: guides.emberjs.com/release/testing/ компоненты тестирования - person QMFNP; 07.10.2019
comment
Похоже, консенсус заключается в том, что интеграционные тесты рекомендуются, поэтому я думаю, что пойду по этому пути. Но я до сих пор не понимаю, почему. Я вижу, что интеграционные тесты создаются автоматически, но это не объясняет, почему они предпочтительнее. Я бы ожидал, что модульные тесты будут предпочтительнее, поскольку они по своей природе легче и более автономны, чем интеграционные тесты. - person Glyoko; 18.10.2019

Если вы выполняете модульное тестирование компонента, вы можете сделать:

const component = this.owner.factoryFor('component:component-that-depends-on-property').create({
  currentUser: user,
});

Это создаст экземпляр вашего компонента с набором currentUser. Вам не нужно будет вызывать init() явно, потому что он вызывается на create().

person Patrick Berkeley    schedule 16.10.2019