2016-06-07 5 views
-1

Я потратил много времени, пытаясь понять, как войти в анонимные функции в жасмине.Как использовать Jasmine/Javascript для анонимных функций

Пример метода:

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

Попробуйте проверить с:

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

Но тестовое покрытие показывает мне, что код метода считывается только в первой строке (rows.each).

Как заставить его прочитать весь код внутри (function() {})?

ответ

0

Почему вы хотите протестировать jQuery? Он отлично работает, если нет - некоторые тесты, вероятно, будут улавливаться перед публикацией новой версии.

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>

Что вы можете проверить - это извлеченный бизнес-логику, которая не зависит самой JQuery.