2013-06-01 10 views
28

W jaki sposób testujesz jednostkę javascript, która używa i modyfikuje DOM?Testowanie jednostki Javascript, który obejmuje DOM

Podam prosty przykład. Walidator formularzy, który sprawdza puste pola tekstowe, napisane w javascript i używające JQuery.

 function Validator() { 

     this.isBlank = function(id) { 
      if ($(id).val() == '') { 
       return true; 
      } else { 
       return false; 
      } 
     }; 

     this.validate = function(inputs) { 

      var errors = false; 

      for (var field in inputs) { 
       if (this.isBlank(inputs[field])) { 
        errors = true; 
        break; 
       } 
      } 

      return errors; 
     }; 
    } 

Zastosowanie:

var validator = new Validator(); 
var fields = { field_1 : '#username', field_2 : '#email' }; 

if (!validator.validate(fields)) { 
    console.log('validation failed'); 
} else { 
    console.log('validation passed'); 
} 

Co jest najlepsze praktyki dla próby badanej jednostki czymś takim?

+1

Sprawdź PhantomJS. http://phantomjs.org/ – Brad

+0

Zobacz także [Testowanie manipulacji DOM w teście Jasmine] (http://stackoverflow.com/questions/7672389/testing-dom-manipulating-in-jasmine-test) –

+0

. i CasperJs: http : //casperjs.org/ – kaore

Odpowiedz

19

Idealnie należy podzielić kod. Logika walidacji tak naprawdę nie wymaga dostępu do DOM, więc umieścisz to w swojej własnej funkcji i umieścisz logikę, która przetwarza identyfikator na wartość, która jest następnie walidowana na inną.

W ten sposób można łatwiej przetestować logikę walidacji, aw razie potrzeby wykonać test funkcjonalny całości, korzystając z niektórych narzędzi zaproponowanych przez Josepha Dreamera.

+1

To jest absolutnie droga. Interakcja z DOM zwykle oznacza, że ​​wykonujesz więcej testów funkcjonalnych lub integracyjnych. Umieść swój kod weryfikacyjny w oddzielnym module za pomocą własnych testów jednostkowych. Następnie włącz moduł za pomocą swojego ulubionego modułu ładującego moduł, takiego jak browserify https://github.com/substack/browserify – Noah

9

Możesz użyć Qunit do testów jednostkowych z wykorzystaniem DOM. Jeśli chcesz go zautomatyzować, możesz użyć zadania Grunt z grunt-contrib-qunit, które uruchamia strony w bezgłowym zestawie WebKit o nazwie PhantomJS.

+2

A oto przykład, jak to zrobić: http://stackoverflow.com/a/4178173/507339 – Nilzor

9

W mało prawdopodobnym przypadku, gdy większość kodu JavaScript zawiera logikę i polegać na niewielkiej ilości kodu jQuery (lub elementów DOM na żywo), można zmienić kod, aby zastąpienie dostępu do DOM/użytkowania jQuery było łatwe, a test zapisu z fałszywymi implementacjami :

function Validator(){ 
    this.getElementValue = function(id){return $(id).val();} 

    this.check_blank = function(id){ 
    if(this.getElementValue(id) == '') // replace direct call to jQuery mock-able call 
     return false; 
    else 
     return true; 
    }.... 
} 

A w teście dostarczyć makiety realizacji:

test("Basic valid field", function() { 
    var validation = new Validator(); 

    // replace element accessor with mock implementation: 
    validation.getElementValue = function(id){ 
    equals(id, "#my_field"); // assert that ID is expected one 
    return "7"; 
    } 
    var form_fields = {field_1 : '#my_field'}; 

    ok(validation.validate(form_fields), "non-empty field should be valid"); 
} 
Powiązane problemy