Я пытаюсь написать тесты для компонента ember, который имитирует реальный пользовательский ввод. Например:Имитация пользовательского ввода в тестах компонентов Ember
<div>
<input class='js-input' type='text' value='{{ bar }}'> </input>
<button class='js-save' type='submit' {{action 'save'}}>
</div>
Мой компонент в настоящее время использует change
и keyUp
события для вычисления другого значения, основываясь на том, что поступил, а также для подтверждения ввода на лету:
import Ember from 'ember';
export default Ember.Component.extend({
bar: null,
modelBar: null,
updateBar: Ember.on('change', 'keyUp', function() {
let bar = this.get('bar');
if (bar.get('notValid')) {
bar = null;
this.set('bar', '');
}
this.set('modelBar', bar);
}),
actions: {
save() {
... save stuff ...
}
}
});
Так я» ve использовал $('.js-input').val('some new value')
для имитации этого (как рекомендовано here, в разделе «Взаимодействие с визуализированными компонентами»).
test('Updates a thing', function(assert) {
assert.expect(1);
const newState = 'a new state';
this.set('actions.save', (newTaxes) => {
assert.ok(true, 'save has been called');
assert.equal(newState, this.get('modelBar'), 'model is updated correctly');
});
this.set('bar', 'initial state');
this.render(hbs`
{{my-component
baz=baz
}}
`);
this.$('.js-input').val(newState);
this.$('.js-input').trigger('change');
this.$('.js-save').click();
});
Однако, когда я запускаю тест, то change
событие не получает обновленное значение для ввода с помощью this.get('bar')
(хотя я могу видеть, если я использую this.$('js-input').val()
). Если я добавлю наблюдателя, я вижу, что наблюдатель получает обновленное значение для свойства, но только после пользовательского события изменения.
Я пробовал обертывать вещи в циклах запуска Ember и run.next, и это тоже не помогло. Есть ли способ сделать эту работу, надеюсь, без необходимости возвращаться на наблюдателей? (Компонент ранее использовал наблюдателя, но некоторые новые требования усложнили ситуацию.)
Я мог бы быть далеко, но я считаю, 'jQuery.sendKeys' (смотри пример в этом [скрипку] (http://jsfiddle.net/DxER9/)) плагин будет делайте то, что вы пытаетесь сделать. – MilkyWayJoe
Интересно! Что-то, что я мог бы исследовать в будущие времена :) – Hannele