aurelia 测试视图更改未反映在视图模型中

aurelia test view change not reflected in viewmodel

我有一个基本的自定义元素。

//my-component.html
<template>
  <input type="text" id="my-input" value.bind="searchText">
</template>

//my-component.js
export class MyComponent {  
  searchText = 'initial text';
}

我在单元测试中试图断言的是,当我在 dom 中更新输入字段 (id=my-input) 的值时,正确的绑定值 (searchText) 也会更新.

这是我的测试 (jasmine/karma)

import {StageComponent} from 'aurelia-testing';
import {bootstrap} from 'aurelia-bootstrapper';

describe('some desc', () => {
  let component;

  beforeEach(() => {    
    component = StageComponent
      .withResources('src/my-component')
      .inView('<div><my-component></my-component></div>');      
  });  

  it('some it', done => {
    component.create(bootstrap).then(() => {
      const inpuElement = document.querySelector('#my-input');

      inpuElement.value = 'new text';
      //component.viewModel.searchText = 'new text';      
      expect(component.viewModel.searchText).toBe('new text');

      done();
    }).catch(e => { console.log(e.toString()) });
  });

  afterEach(() => {
    component.dispose();
  });
});

当我 运行 测试失败时
预计 'initial text' 为 'new text'

为了让它通过,我需要更换 component.viewModel.searchText = 'new text'; 和 inpuElement.value = 'new text';

我真的不想这样做,因为我试图模仿用户直接在输入字段中输入文本。

这可以做到吗?如果可以,我还缺少什么?

我猜你正在寻找这样的东西:https://github.com/aurelia/testing/issues/70

Aurelia 正在观察 DOM 事件以更新虚拟机。由于您不触发任何事件,VM 不是 "notifying" 的变化。做这样的事情(假设你使用 aurelia-pal):

import {StageComponent} from 'aurelia-testing';
import {bootstrap} from 'aurelia-bootstrapper';
import {DOM} from 'aurelia-pal';

describe('some desc', () => {
  let component;

  beforeEach(() => {    
    component = StageComponent
      .withResources('src/my-component')
      .inView('<div><my-component></my-component></div>');      
  });  

  it('some it', done => {
    component.create(bootstrap).then(() => {
      const inputElement = DOM.getElementById('my-input');
      inputElement.value = 'new text';
      inputElement.dispatchEvent(DOM.createCustomEvent('change'));

      setTimeout(() => {
          expect(component.viewModel.searchText).toBe('new text');
          done();
      }, 50);
    }).catch(e => { console.log(e.toString()) });
  });

  afterEach(() => {
    component.dispose();
  });
});