AngularJS/Karma测试:beforeEach未执行

JES*_*Sii 8 tdd angularjs karma-jasmine

我正在为AngularJS开发一些TDD(完全是另一个故事)并遇到了我的beforeEach调用显然没有被执行的情况.我把它减少到下面的例子.

事实证明,beforeEach中的console.log消息和它们都出现了:

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

  it('should be able to log something', function(){ 
    console.log("in it...");
  }); 
});
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为未显示beforeEach中的console.log消息,并且在尝试$ log.info并且抛出错误消息时它失败: 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...");
  }); 
});
Run Code Online (Sandbox Code Playgroud)

我正在使用Angular 1.3.15,业力0.12.31,茉莉2.3.4.我可能会忽略一些明显的东西......

编辑:Michael Radionov的解释非常有用; 但是,我不明白为什么这个修改过的代码仍然会抛出相同的错误.

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
  }); 
});
Run Code Online (Sandbox Code Playgroud)

此外,似乎"module('userApp'..."中的代码从未执行过......?

Mic*_*nov 5

你的日志消息console.log("in beforeEach...");没有被显示的原因是因为它实际上不在里面beforeEach,它在一个匿名函数里面,module(..)作为一个参数被传递给一个被angular-mocks认为是模块的参数.此模块仅在注入发生时执行,同时您将收到日志消息in beforeEach...,但测试中没有任何注入,因此它永远不会发生.beforeEach无论如何,你只是没有把它放在console.log正确的地方; 它会工作:

beforeEach(function () {

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

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

});
Run Code Online (Sandbox Code Playgroud)

此外,您似乎忘了将模拟$log注入您的测试套件,您的$log变量永远不会获得任何值,因此它会保持未定义为错误状态.

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

});
Run Code Online (Sandbox Code Playgroud)

请参阅plunker:http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p = preview

文档: