2014-12-18 5 views
10

Ich habe den folgenden Code:-Test imagesLoaded() Fortschritt Rückruf mit Jasmin

$.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'); 
      }); 
}); 

ich mehrere Tests für diesen Block von Code geschrieben haben, aber ich kann nicht scheinen, um es ausführen zu:

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

Ausgang:

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

In Ihrer ersten forEach-Schleife führen Sie Ihre Assertion auf val, bevor Sie sie definiert haben. – Jeff

+0

Können Sie bitte Ihren Code erweitern, um anzuzeigen, wo Sie 'var val;' deklarieren? Bitte fügen Sie auch die Startnummer Ihrer Spezifikation hinzu. Könntest du bitte näher erläutern, warum du 'erwarten'() 'bebeDefined()' ** bevor ** einen Wert in das erste 'ìt()' hineinbekommt? Möglicherweise absichtlich oder einer Ihrer Fehler. Last but not least: Im zweiten 'it()' speichern Sie einen Attributwert in 'val'; wenn es nicht definiert ist, kann dies daran liegen, dass das Element '# modal-avatar-image' nicht in das Dokument eingefügt wurde (es wurde zwar erstellt, aber nicht eingefügt,' $ ("# modal-avatar-image") 'wird nicht gefunden Es dann). –

Antwort

3

In Ihrer ersten foreach-Schleife folgt aus:

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

sollte sein:

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

Sieht aus wie Sie Ihre Behauptung auf val laufen lassen, bevor sie definiert ist.