2016-07-31 12 views
3

Ich versuche, das Lernprogramm here an die Verwendung von QUnit v2.x anzupassen, aber es scheint nicht die JavaScript-Datei aufzunehmen, die ich testen möchte.QNicht externe JavaScript-Datei ausführen

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

Der Test schlägt fehl, mit dem Ergebnis der wahren

Die bereitgestellten Code in das Tutorial mit QUnit 1,23

funktioniert gut
<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> 

Edit: Mit QUnit v1.23 arbeiten beide Versionen der Tests!

+0

Sind Sie sicher, dass alle Skript Pfade in Ihrer * test.html * richtig lösen? Wenn der Test fehlschlägt, scheint der Code in * list.js * nicht ausgeführt zu werden. –

+0

Wenn der Code oberhalb der Tests in ein Skript-Tag eingefügt wird, funktioniert er immer noch nicht. Ich bin mir nicht sicher, ob das wie beabsichtigt funktioniert. Auf die Datei list.js kann in den Web Inspector-Ressourcen zugegriffen werden. –

+0

Ich denke, dass Sie den HTML-Teil aus dem Tutorial dann vermissen? Ohne dass Ihr Selektor '.has-error' nichts auswählt. Ich habe [diese Geige] (https://jsfiddle.net/vhjparpv/#&togetherjs=PpGJ5xKVrA) erstellt und beide Tests funktionieren gut. –

Antwort

2

Also, diese Frage ist in multiple other places auf SO gekommen. Im Wesentlichen hat QUnit 2 Fixtures unterschiedlich gehandhabt. Ihr Code fügt dem ursprünglichen HTML einen Event-Handler hinzu, aber dann beendet QUnit diesen HTML-Code und baut ihn neu auf, wodurch Ihr Handler entfernt wird. Die Lösung besteht darin, das Ereignis innerhalb Ihres Tests zu binden, nicht beim Laden der Seite. Hier ist a fiddle mit zu spielen, aber der Code ist unten:

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

Also muss ich meinen ganzen Code in Funktionen für QUnit einbinden? Das scheint sehr dumm –

+0

@ Peregrinius ich bitte um zu unterscheiden. Ihr Code sollte aus Komponenten bestehen, die unabhängig von einer Einheit und einer (Geräte-) Integration getestet werden können. Das Testen wird viel expliziter und wartungsfreundlicher, als sich nur auf den globalen Zustand zu verlassen. Der obige Code sieht möglicherweise etwas besser aus, wenn Sie 'beforeEach'-Hooks verwenden. –

+0

@Peregrinius Sie müssen nicht Ihren ganzen Code in Funktionen schreiben, aber wenn Sie das nicht tun, dann bereiten Sie sich auf ein Durcheinander vor. Abgesehen davon macht QUnit das, was korrekt ist, indem es das HTML vor jedem Test zurücksetzt. Das ist Industriestandard für HTML-Fixtures. – jakerella