2017-09-04 17 views
0

私は基本的なカスタム要素を持っています。私は私のユニットテストで主張しようとしています何aureliaテストビューの変更はビューモデルに反映されません

//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 =私の入力)の値を更新する際、正しい界値(検索テキスト)も更新されていることです。

HERESに私のテスト(ジャスミン/カルマ)

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

私はこれを実行すると、テストが「最初のテキスト」それは私が必要と渡し得るために「新しいテキスト」

されることが予想
で失敗します置換する component.viewModel.searchText = '新しいテキスト'; と inpuElement.value = 'new text';

私は実際に入力フィールドにテキストを入力するユーザを模倣しようとしているので、これをやりたいとは思わない。

これを行うことができますかもしそうなら、何が欠けていますか?

+1

わからないのが、割り当てた後、 'inputElement.dispatchEvent(新しいイベント(「入力」))'を追加してみてください。 – Benny

+0

ちょうどあなたの答えに気づいたベネニーは、aurelia-palの部分がなくても働きました申し訳ありませんが、私は両方とも答えとしてマークしません – user4912152

答えて

0

私はあなたがこのような何かを探していると思います:https://github.com/aurelia/testing/issues/70

オーレリアは、VMを更新するためにDOMイベントを観察しています。イベントをトリガーしないので、VMは変更を通知していません。このような何か(あなたが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(); 
    }); 
}); 
+0

Marc this worked – user4912152

関連する問題