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 ...?
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
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 –
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