2015-07-05 36 views
8

AngularJS (tamamen başka bir hikaye) için bazı TDD üzerinde çalışıyorum ve beforeEach çağrılarımın gerçekleştirilmediği bir durumda çalıştı. Aşağıdaki örneğe indirdim.AngularJS/Karma testi: beforeEach yürütülemedi

beforeEach içinde console.log mesajlar ve her iki vermesinin kanıtladığı gibi bu işleri

: Aslında kanıtladığı gibi,

describe('userApp', function(){ 
    beforeEach(function(){ 
    console.log("in beforeEach..."); 
    }); 

    it('should be able to log something', function(){ 
    console.log("in it..."); 
    }); 
}); 

Bu çalışmadığını içinde console.log mesajı beforeEach gösterilir ve hata mesajını $ log.info çalışırken başarısız olur ve atar DEĞİLDİR: TypeError: Cannot read property 'info' of undefined

describe('userApp', function(){ 
    var $log; 
    beforeEach(module('userApp', function($provide) { 
    console.log("in beforeEach..."); 
    // Output messages 
    $provide.value('$log', console); 
    })); 
    it('should be able to log something', function(){ 
    console.log("in it..."); 
    $log.info("Using $log for logging..."); 
    }); 
}); 

Ben Açısal 1.3.15 karma 0.12.31, yasemin 2.3.4 kullanıyorum. Muhtemelen bir şey göründüğüm bariz bir şeydir ...

EDIT: Michael Radionov'un açıklaması çok faydalıdır; ancak, bu değiştirilmiş kodun neden aynı hatayı attığını anlamıyorum.

describe('userApp', function(){ 
    console.log("starting TEST3"); <=== this prints 
    var $log; 
    beforeEach(function() { 
    console.log("TEST3: in beforeEach..."); <=== this prints 
    module('userApp', function($provide, _$log_) { 
     $log = _$log_; 
     console.log("TEST3: in beforeEach/module..."); <=== never executed 
     // Output messages 
     $provide.value('$log', console); 
     $log.info("TEST3: calling $log in beforeEach..."); 
    }) 
    }); 
    it('should be able to log something', function(){ 
    console.log("TEST3: in it..."); 
    $log.info("TEST3: Using $log for logging..."); <=== $log undefined err 
    }); 
}); 

Ayrıca, kod görünüyor "modülü ('userApp' ..." asla çalıştırılmaz değil çünkü ...?

cevap

5

sizin günlük mesajı console.log("in beforeEach..."); görüntülenmiyor nedenidir aslında'un içinde, angular-atakları tarafından bir modül olduğu düşünülen bir argüman olarak bir module(..)'a geçirilen bir anonim işlev içerisindedir.Bu modül yalnızca enjeksiyon gerçekleştiğinde ve aynı zamanda bir günlük mesajı alırsınız in beforeEach..., ama testinizde herhangi bir enjeksiyon yok, bu yüzden asla olmaz beforeEach yangınlar, sadecekoymadı Doğru yerde 10; işe yarayacak: Bu hata durumları olarak tanımlanmamış kalacak şekilde

beforeEach(function() { 

    console.log("in beforeEach..."); 

    module('userApp', function($provide) { 
    // Output messages 
    $provide.value('$log', console); 
    }); 

}); 

Ayrıca size size test paketi içine $log alay enjekte etmek unuttuğunu görünüyor senin $log değişken, herhangi bir değeri alır asla. yardım etmeye başlar

+0

Teşekkür, Michael ...: http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p=preview

Dokümanlar:

describe('userApp', function(){ var $log; beforeEach(function() { console.log("in beforeEach..."); module('userApp', function($provide) { // Output messages $provide.value('$log', console); }); // getting an instance of mocked service to use in a test suite inject(function (_$log_) { $log = _$log_; }); }); it('should be able to log something', function(){ console.log("in it..."); $log.info("Using $log for logging..."); }); }); 

plunker bakın. Yayını çalışacakmış gibi görünen başka bir örnekle güncelleyeceğim. Her şeye rağmen - beforeEach() 'ın hepsi çalıştırılsa bile, bunların içindeki modül() kodu mutlaka aynı anda idam edilmez mi? – JESii

+0

Güncellemenizde 'module()' kullanarak '_ $ log_' enjekte etmeyi deneyin, ancak işe yaramayacak. '' '(' '' 'inject()' dediğinizde çalıştırılacak modülleri kaydetmek içindir. Enjeksiyon enjektördeki çalışmadır. Enjeksiyon() işlevini her birinden önce burada girerseniz, "* aynı zamanda *" olarak kabul edilebilir. Benim örneğimde, –

+0

Teşekkür, Michael; Bunu açıklamak için iyi bir iş çıkardın. Ancak, bu Angular sadece delirmeye başlar, IMO. Önce 'enjeksiyonu', 'modül' ifadesini izlerseniz, o zaman "Enjektör zaten oluşturuldu, bir modülü kaydedemez!" Bu konuda http: // stackoverflow adresinde SO hakkında bir tartışma var.com/questions/24900067/enjektör-zaten-oluşturulamıyor-bir-çok-kayıt-a-modülü ile birçok farklı yaklaşımlar ... cevap @gilamarn tarafından cevap üzerinde dikkat. Angular içinde test gibi görünüyor çok persnickety. – JESii