我正在为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...");
  });
});

这不起作用,如以下事实所证明: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...");
  });
});

我正在使用Angular 1.3.15, karma 0.12.31, Jasmine 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
  });
});

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

最佳答案

未显示日志消息console.log("in beforeEach...");的原因是,它实际上不在beforeEach内部,而是在传递给module(..)作为参数的匿名函数内部,该函数被angular-mocks视为模块。仅在发生注入(inject)时才会执行此模块,同时您将收到日志消息in beforeEach...,但是测试中没有任何注入(inject),因此它永远不会发生。无论如何,beforeEach会触发,只是您没有将console.log放在正确的位置;它会工作:

beforeEach(function () {

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

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

});

同样,您似乎忘记了将模拟的$log注入(inject)到测试套件中,您的$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...");
  });

});

见矮人:http://plnkr.co/edit/EirNEthh4CXdBSDAeqOE?p=preview

文件:
  • angular.mock.inject
  • angular.mock.module
  • 关于AngularJS/Karma测试: beforeEach not executed,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31235885/

    10-10 18:54