2016-07-31 85 views
3

我試圖修改教程here以使用QUnit v2.x,但它似乎沒有找到我想測試的JavaScript文件。QUnit沒有運行外部JavaScript文件

的test.html

<div id="qunit"></div> 
<div id="qunit-fixture"> 
    <form> 
    <input name="text" /> 
    <div class="has-error">Error text</div> 
    </form> 
</div> 

<script src="http://code.jquery.com/jquery.min.js"></script> 
<script src="qunit.js"></script> 
<script src="../list.js"></script> 
<script> 

    QUnit.test("errors should be hidden on keypress", function (assert) { 
     $('input').trigger('keypress'); 
     assert.equal($('.has-error').is(':visible'), false); 
    }); 

</script> 

list.js

jQuery(document).ready(function ($) { 
    $('input').on('keypress', function() { 
     $('.has-error').hide(); 
    }); 
}); 

試驗失敗的真正

結果本教程中提供的代碼工作正常QUnit 1.23

<script> 

/*global $, test, equal */ 

test("errors should be hidden on keypress", function() { 
    $('input').trigger('keypress'); 
    equal($('.has-error').is(':visible'), false); 
}); 

test("errors not be hidden unless there is a keypress", function() { 
    equal($('.has-error').is(':visible'), true); 
}); 

</script> 

編輯:使用QUnit v1.23這兩個版本的測試工作!

+0

你確定你的*的test.html的所有腳本路徑*妥善解決?如果測試失敗,那麼它似乎就像* list.js *中的代碼沒有運行。 –

+0

將代碼放在測試上方的腳本標記中時,它仍然不起作用。我不確定那是否按預期工作。 list.js文件可以在Web Inspector資源中訪問。 –

+0

我想你錯過了教程中的HTML部分呢?沒有你的選擇器'.has-error'將不會選擇任何東西。 我創建了[這個小提琴](https://jsfiddle.net/vhjparpv/#&togetherjs=PpGJ5xKVrA),兩個測試都正常。 –

回答

2

所以,這個問題已經出現在SO上的multiple other places。基本上發生的事情是QUnit 2以不同的方式處理燈具。您的代碼將一個事件處理程序添加到原始HTML中,但隨後QUnit殺死該HTML並重建它,從而刪除您的處理程序。解決辦法是在內部執行綁定的事件,而不是頁面加載。這裏是a fiddle一起玩,但代碼如下:

function init() { 
    $('.username').on('keypress', function() { 
     console.log('hiding error!'); 
     $('.has-error').hide(); 
    }); 
    } 

    QUnit.test("errors should be hidden on keypress", function(assert) { 
    init(); 
    $('.username').trigger('keypress'); 
    assert.strictEqual($('.has-error').is(':visible'), false); 
    }); 

    QUnit.test("errors not be hidden unless there is a keypress", function(assert) { 
    init(); 
    assert.strictEqual($('.has-error').is(':visible'), true); 
    }); 
+1

所以我必須將所有代碼包裝在QUnit的函數中?這似乎很愚蠢 –

+0

@Peregrinius我乞求不同。您的代碼應該設計在可以進行單元和(單元)集成測試的組件中,並彼此獨立地進行測試。與只依賴和測試全局狀態相比,測試變得更加明確和更易維護。 如果你使用'beforeEach'鉤子,上面的代碼可能會更好看一些。 –

+0

@Peregrinius你不需要把所有的代碼都寫在函數中,但是如果你不這樣做,那麼你就會陷入混亂。除此之外,QUnit通過在每次測試之前重置HTML來做正確的事情。這是HTML設備的行業標準。 – jakerella