2014-12-18 3 views
10

У меня есть следующий код:Test imagesLoaded() прогресс обратного вызова с использованием жасмин

$.ajax({ 
     url: API + "item/" + item_id.replace('-',':'), 
     beforeSend: function(xhr){xhr.setRequestHeader('x-customer', customer);}, 
     format: "json", 
     success: function(data){ 
      var template_name = data.source + settings.overlay_style; 
      $('#modal .modal-content').html(Handlebars.templates[template_name](data)); 

     /* Handle missing avatars */ 
     $('#modal-avatar-image').imagesLoaded() 
      .progress(function(instance, image) { 
       if (!image.isLoaded) { 
        image.img.src = "/images/404_avatar.svg"; 
        image.img.alt = "The avatar for this user could not be found. Showing placeholder"; 
        image.img.title = "The avatar for this user could not be found. Showing plac eholder"; 
       } 
      }); 

     /* Handle missing main content */ 
     $('.modal-img').imagesLoaded() 
      .progress(function(instance, image) { 
       if (!image.isLoaded) { 
        image.img.src = "/images/404_image.svg"; 
        image.img.alt = "This image is lost in space. Could be removed by user or could be lost in a remote tube"; 
        image.img.title = "This image is lost in space. Could be removed by user or could be lost in a remote tube"; 
       } 
       $('.modal-img').removeClass('loading'); 
      }); 
}); 

Я написал несколько тестов для этого блока кода, но я не могу показаться, чтобы заставить его выполнить:

var attrs = ['src', 'alt', 'title']; 

      attrs.forEach(function(attr, idx, arr) { 
       it('should set default ' + attr + ' for img#modal-avatar-image', function() { 
        spyOn($, 'ajax').and.callFake(function(e){ 
         e.success({'source': 'twitter'}); 
        }); 
        openModal('test'); 
        expect(val).toBeDefined(); 
        val = $($("#modal-avatar-image")[0]).attr(attr); 
        if(attr === 'src'){ 
         //expect the src to chnage from the old value 
         expect(val !== src).toBeTruthy(); 
        } 
       }); 
      }); 

      attrs.forEach(function(attr, idx, arr) { 
       it('should set default ' + attr + ' for img.modal-img', function() { 
        spyOn($, 'ajax').and.callFake(function(e){ 
         e.success({'source': 'twitter'}); 
        }); 
        openModal('test'); 
        val = $($(".modal-img")[0]).attr(attr); 
        expect(val).toBeDefined(); 
        if(attr === 'src'){ 
         //expect the src to chnage from the old value 
         expect(val !== src).toBeTruthy(); 
        } 
       }); 
      }); 

Выход:

Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at Object.<anonymous> (/home/oleg/dev/hub/test/fed/api.scenerio.js:346:41) 
    Expected false to be truthy. 
    Error: Expected false to be truthy. 
     at Object.<anonymous> (/home/oleg/dev/hub/test/fed/api.scenerio.js:350:53) 


    Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at Object.<anonymous> (/home/oleg/dev/hub/test/fed/api.scenerio.js:346:41) 


    Expected false to be truthy. 
    Error: Expected false to be truthy. 
     at Object.<anonymous> (/home/oleg/dev/hub/test/fed/api.scenerio.js:365:53) 


    Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at Object.<anonymous> (/home/oleg/dev/hub/test/fed/api.scenerio.js:362:41) 


    Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at Object.<anonymous> (/home/oleg/dev/hub/test/fed/api.scenerio.js:362:41) 
+0

В вашем первом цикле forEach вы выполняете свое утверждение на val, прежде чем определили его. – Jeff

+0

Можете ли вы расширить свой код, чтобы показать, где вы объявляете 'var val;'? Кроме того, добавьте номер стартовой строки в спецификации. Можете ли вы рассказать о том, почему вы ожидаете() '' val'' toBeDefined() '** перед тем, как ** получить значение в нем в первом' 't()'? Может быть преднамеренно или одна из ваших ошибок. И последнее, но не менее важное: во втором 'it()' вы храните значение атрибута в 'val'; если он не определен, это может быть вызвано тем, что элемент '# modal-avatar-image' не вставлен в документ (он мог быть создан, но не вставлен,' $ ("# modal-avatar-image") 'не найдет это тогда). –

ответ

3

В своем первом цикле Foreach, это:

expect(val).toBeDefined(); 
val = $($("#modal-avatar-image")[0]).attr(attr); 

должен быть:

val = $($("#modal-avatar-image")[0]).attr(attr); 
expect(val).toBeDefined(); 

Похоже, вы бежите ваше утверждение о Вале, прежде чем она определена.