2015-06-11 24 views
8

Bir AngularJS uygulamasında bazı mantık için birim testleri yazmak için Jasmine 2.0 kullanmaya çalışıyorum, ancak mantık olay dinleyicisinin içinde.Jasmine async ile test postMessage çalışmıyor

window.addEventListener('message', function(e) { 
    if (e.data === "sendMessage()") { 
     $scope.submit(); 
    } 
    }, false); 

Ve Test dosyasından: Denetleyicisinden

describe("post message", function() { 
    beforeEach(function(done) { 
     var controller = createController(controllerParams); 
     spyOn($scope, 'submit'); 
     window.postMessage('sendMessage()', '*'); 
     done(); 
    }); 

    it('should submit on a sent message', function (done) { 
     expect($scope.submit).toHaveBeenCalled(); 
     done(); 
    }); 
    }); 

Ama Test başarısız, casus vurulduktan olmadı. Konsol ayıklama tablolara koyarak gelen Ekstra bilgi:

  • window.addEventListener denetleyicisi denilen oluyor.
  • beforeEach ve it bloklarının ikisi de aranıyor.
  • Kontrolördeki yukarıdaki mesaj işleyici test sırasında aranmıyor.
  • Bu testte gönderilen mesaj, birkaç kez mesaj işleyici tarafından alınır, ancak test bittikten sonra olmaz.

Testim eksik burada?

+0

Olayı alacak olandan * başka * pencere üzerinde postMessage'i aramanız gerekmiyor mu? (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage?redirectlocale=en-US&redirectslug=DOM%2Fwindow.postMessage öğesinde yapılan gibi bir pop-up oluşturma gibi) – phtrivier

+0

pencereden bir postmessage yerine pencereden bir açılır pencereden bir postmessage, ama tüm bu değişti, mesajı çok geç almak yerine, bu mesajı hiç almaz. –

+0

@AlanGordon: Bunun için bir çözüm buldunuz mu? Aynı sorunları yaşıyorum ;-) –

cevap

6

Bu sizin beforeEach bloğunda çünkü oluyor ona window.postMessage() çağrı (eşzamansızsa ve yapacaklarını yürütmek yaptığında sizi bilmiyorum) ve senkron kod olurdu o zaman sağ sonra done() diyoruz. Ancak async olarak window.postMessage() ve async işlemi tamamlandığında temel olarak done()'u aramanız gerekir. Böyle yapılabilir:

beforeEach(function(done) { 
    spyOn(someObject, 'submit').and.callFake(function() { 
     done(); 
    }); 
}); 

casus yürütür Yani

ardından zaman uyumsuz işlemi tamamlanmış kabul edilir.

Bu da kısa ifade edilebilir: Çalışan bir JS Bin

var someObject = { 
    submit: function() { 
    console.log('Submit'); 
    } 
}; 

window.addEventListener('message', function(e) { 
    if (e.data === "sendMessage()") { 
    someObject.submit(); 
    } 
}, false); 

// Test 

describe('window.postMessage', function() { 

    beforeEach(function(done) { 
    spyOn(someObject, 'submit').and.callFake(function() { 
     done(); 
    }); 
    window.postMessage('sendMessage()', '*'); 
    }); 

    it('should submit on a sent message', function() { 
    expect(someObject.submit).toHaveBeenCalled(); 
    }); 

}); 

Bkz: http://jsbin.com/xikewogagu/1/edit?html,js,console,output

Bu örnekteki Açısal kullanmıyordu İşte

beforeEach(function(done) { 
    spyOn(someObject, 'submit').and.callFake(done); 
}); 

tam koddur çünkü saf bir JS ile yeniden üretilebilir.

+0

Bu tam olarak öyle! Yardım için teşekkürler. –