2016-06-07 10 views
-1

Ich habe viel Zeit damit verbracht, herauszufinden, wie man in anonyme Funktionen in Jasmin gehen kann.Wie man Jasmine/Javascript für anonyme Funktionen verwendet

Probe der Methode:

numerateColumns: function (rows) { 
      rows.each(function() { 
       var $row = $(this); 
       $row.children().each(function (index) { 
        var $cell = $(this); 
        $cell.addClass('column-' + (index + 1)); 
       }); 
      }); 
     } 

Versuchen zu testen, mit:

it("[TEST] Should call each method.", function() { 

      // setup 
      var rows = { 
       each: function() { 
        return { 
         children: function() { 
          return { 
           replaceWith: function() { 
            return null; 
           } 
          }; 
         } 
        }; 
       } 
      }; 
      spyOn(rows, 'each').and.callThrough(); 

       // method under test 
       module.numerateColumns(rows); 

       // expectations 
       expect(rows.each).toHaveBeenCalled(); 
      }); 

Aber Berichterstattung Test zeigt mir, dass Code der Methode nur in der ersten Zeile gelesen wird (rows.each).

Wie erzwingen Sie es, den gesamten Code innerhalb (function() {}) zu lesen?

Antwort

0

Warum möchten Sie jQuery testen? Es funktioniert einwandfrei, wenn nicht - einige Tests werden wahrscheinlich vor der neuen Version Veröffentlichung fangen.

function numerateColumns($rows) { 
 
    $rows.each(function() { 
 
    var $row = $(this); 
 
    $row.children().each(function(index) { 
 
     var $cell = $(this); 
 
     $cell.addClass('column-' + (index + 1)); 
 
    }); 
 
    }); 
 
} 
 

 
describe('Iterate over columns`', function() { 
 
    var mockRows 
 

 
    beforeEach(function() { 
 
    mockRows = $('<div><div></div></div>') 
 
    }) 
 

 
    it("calls .each() on passed jQuery collection", function() { 
 
    spyOn($, 'each').and.callThrough(); 
 
    
 
    expect($.each).not.toHaveBeenCalled(); 
 

 
    numerateColumns(mockRows); 
 

 
    expect($.each).toHaveBeenCalled(); 
 
    }); 
 

 
    it("adds CSS class to each child", function() { 
 
    var column = $(mockRows[0]).find('div'); 
 
    
 
    expect(column.hasClass('column-1')).toBeFalsy() 
 
    
 
    numerateColumns(mockRows); 
 

 
    expect(column.hasClass('column-1')).toBeTruthy() 
 

 
    }); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" /> 
 
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>

Was Sie testen können - es wird extrahiert Business-Logik, die jQuery selbst unabhängig ist.

Verwandte Themen