2015-07-05 8 views
8

Ich arbeite an einer TDD für AngularJS (eine andere Geschichte insgesamt) und lief in eine Situation, in der meine beforeEach-Aufrufe anscheinend nicht ausgeführt werden. Ich habe es auf das folgende Beispiel reduziert.AngularJS/Karma-Test: beforeJede nicht ausgeführt

Dies wird durch die Tatsache belegt, wie funktioniert, dass die console.log Nachrichten in before und beide erscheinen:

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

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

Dies funktioniert nicht, durch die Tatsache belegt, dass die als console.log Nachricht in der before wird nicht angezeigt, und die es schlägt fehl, wenn auf $ log.info versucht, und wirft die Fehlermeldung: 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..."); 
    }); 
}); 

ich verwende Angular 1.3.15, Karma 0.12.31, Jasmin 2.3.4. Wahrscheinlich etwas offensichtlich Ich übersehe ...

EDIT: Michael Radionov Erklärung ist sehr hilfreich; Ich verstehe jedoch nicht, warum dieser geänderte Code immer noch denselben Fehler verursacht.

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

Darüber hinaus ist es der Code in scheint „-Modul (‚userApp‘...“ wird nie ausgeführt ...?

Antwort

5

Der Grund Lognachricht console.log("in beforeEach..."); nicht angezeigt wird, weil es nicht ist tatsächlich innerhalb beforeEach, ist es innerhalb einer anonymen Funktion, die an ein module(..) als ein Argument übergeben wird, das als ein Modul von angular-mocks betrachtet wird.Dieses Modul wird nur ausgeführt, wenn die Injektion geschieht und zur gleichen Zeit erhalten Sie eine Protokollmeldung in beforeEach..., aber es gibt keine Injektion in Ihrem Test, also passiert es nie .. beforeEach feuert sowieso, Sie haben geradenicht gesetzt 10 an der richtigen Stelle; es funktioniert:

beforeEach(function() { 

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

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

}); 

Auch scheint es, dass Sie $log in ihre Testsuite verspottet spritzen vergessen zu, Ihr $log Variable wird nie ein beliebigen Wert, so ist es, wie die Fehlerzustände undefiniert bleibt.

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

}); 

Siehe Plunker: http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p=preview

Docs:

+0

Danke, Michael ..., die zu helfen, beginnt. Ich werde den Beitrag mit einem anderen Beispiel aktualisieren, das so aussieht, als ob es funktionieren sollte. Es klingt so, als ob - obwohl die beforeEach() alle ausgeführt werden, der modul() - Code in ihnen nicht notwendigerweise zur gleichen Zeit ausgeführt wird? – JESii

+0

In deinem Update versuchst du '_ $ log_' mit' module() 'zu injizieren, aber es wird nicht funktionieren. 'module()' dient nur zum Registrieren von Modulen, die beim Aufruf von 'inject()' ausgeführt werden. Die Injektion ist die Arbeit am Injektor. Wenn Sie 'inject()' hier vor jedem aufrufen, kann es als "* zur gleichen Zeit *" betrachtet werden. In meinem Beispiel habe ich 'inject' in den gleichen' beforeEach' verschoben, um es ein wenig klarer zu machen, dass –

+0

Danke, Michael; Du hast es gut gemacht, das zu erklären. Aber hier fängt Angular einfach an verrückt zu werden, IMO. Wenn ich zuerst 'inject' und dann 'module' aussage, dann bekomme ich "Injector erstellt, kann kein Modul registrieren!". Es gibt bereits eine Diskussion über SO unter http: // stackoverflow.com/questions/24900067/Injector-bereits erstellt-kann-nicht-registrieren-ein-Modul mit vielen verschiedenen Ansätzen ... Beachten Sie das Argument über die Antwort von @Gilamarn. Es scheint so, als wäre das Testen in Angular sehr persicknickig. – JESii