2017-02-22 4 views
0

私は簡単なDOM操作をテストしていくつかの問題に遭遇しようとしています。次の簡単なクリックイベントを想像してみて:jQueryを使用したDOMのテキスト操作のユニットテスト

$('.js-click-me').on('click', function(e) { 
    e.preventDefault(); 

    $('.some-span').text('changed text'); 
}); 

今も私のHTMLは次のものが含まれていることを想像:

<span class="some-span">Original Text</span> 
<button class="js-click-me">Click Me</button> 

[OK]を、私は持っているので、今ユニットは、私の期待はある

describe('text change test', function() { 
    it('The text of .some-span should change when button is clicked', function() { 
    assert.equal('Original Text', $('.some-span').text()); 
    $('.js-click-me').click(); 
    assert.equal('changed text', $('.some-span').text()); 
    }); 
}); 

テスト元のテキストが実際には「元のテキスト」であるため(最初はベースラインを設定するために行われたものであり、おそらく必須ではない)、最初のアサーションが成功すると主張します。

クリック後、「元のテキスト」から「変更されたテキスト」にテキストが変更されているため、2番目のアサーションが必要になります。しかし、このようなテストを実行すると、テストがすぐにの後に実行され、DOMがテキストをまだ更新していないため、2番目のアサーションが失敗します。

setTimeoutラッパーに2番目のテストを追加することはできますが、それは正しくないまたは効率的ではないようです。

これについてのヒントを教えてください。

+0

「クリック」は単なる例に過ぎません。私は、呼び出される関数の一部を含めて、テキストが変わる可能性があるあらゆる可能な方法をテストしたい。 –

+0

'$(..).click()'を呼び出して生成されたイベントは、同期して処理されます。あなたのDOMが実際に変更されているが、あなたのテストがそれを拾うことができないという手動によるチェックをしましたか? – Louis

+0

はい。私はこのDOM変更をトリガするために使用しているクリックイベントではありません。私がテキスト値を警告するなら、それは正しいです。私は.find()と.children()を使わない方がよりパフォーマンスが良いので、遅れずに変更され、タイムアウトが必要なものは変更されると思います。 –

答えて

0

を使用してください。 次にの機能。以下のようにコード

describe('text change test', function() { 
    it('The text of .some-span should change when button is clicked', function() { 
    assert.equal('Original Text', $('.some-span').text()); 
    $('.js-click-me').click().then(function(){ 
     assert.equal('changed text', $('.some-span').text()); 
    });  
    }); 
}); 
+0

.then()は、約束を返す関数に対してのみ機能し、私はクリックとは思わない。しかし、間違っている可能性があります。 –

関連する問題