JasmineJS无法识别我注入的模块

时间:2013-02-02 19:10:59

标签: jquery angularjs jasmine

应用程序上的所有内容都可以正常工作,所以它只是我的语法不正确的测试。这是我正在使用的截断版本。名称和位置已经改变,以保护无辜者。

var m;

m = angular.module('CustomService', []);

window.CustomService = m.factory("CustomService", function($rootScope) {
  var sharedService;
  sharedService = {};
  sharedService.broadcastItem = function() {
    return console.log('Works!');
  };
  return sharedService;
});

window.MyCtrl = function($scope, $location, CustomService) {
  this.$inject = ['$scope', 'CustomService'];
  return $scope.test_method = function(date) {
    return CustomService.broadcastItem(date);
  };
};

describe('MyCtrl', function() {
  beforeEach(inject(function($rootScope, $controller, $location) {
    this.scope = $rootScope.$new;
    return this.controller = $controller(MyCtrl, {
      $scope: this.scope,
      $location: $location,
      CustomService: CustomService
    });
  }));
  return it('tests my method', function() {
    return this.scope.test_method('10-1984');
  });
});

最后一行返回:

TypeError: Object #<Object> has no method 'test_method'

奇怪!因为我的整个应用程序都能正常运行,并且这种方法可以完美运行。所以一定是我没有正确地注入这个模块(猜测!)。

2 个答案:

答案 0 :(得分:3)

你的代码和测试中发生了很多事情,所以真的很难将它们全部列出来。由于你没有提供要测试的实现(除了日志)所以很难完全帮助这个测试,所以我已经找到了我想你想要做的事情并进行测试。

所以,这是测试:

describe('MyCtrl', function() {

  var scope, controller;
  beforeEach(module('CustomService'));
  beforeEach(inject(function($rootScope, $controller, $location) {
    scope = $rootScope.$new();
    controller = $controller('MyCtrl', {
      $scope: scope
    });
  }));

  it('tests my method', function() {
    scope.test_method('10-1984');
    expect(scope.brodcastedValue).toEqual('10-1984');
  });
});

测试中的问题是:

  • 范围创建不正确($new()是一种方法而不是属性
  • 缺少对模块的引用:beforeEach(module('CustomService'));
  • 为控制器指定的依赖项太多

我还修改了代码本身以使测试通过:

m.factory("CustomService", function($rootScope) {
  var sharedService;
  sharedService = {};
  sharedService.broadcastItem = function(date) {
    $rootScope.$broadcast('works', date);
  };
  return sharedService;
});

m.controller('MyCtrl', function($scope, $location, CustomService) {

  $scope.test_method = function(date) {
    CustomService.broadcastItem(date);
  };

  $scope.$on('works', function(event, date){
    $scope.brodcastedValue = date;
  });
});

不确定以上是否是您的意图。无论如何,看起来代码是从CoffeScript或其他东西转换而来的(充满了返回和这个)所以我不确定我是否正确。

最后,一个工作的插件,希望这个将澄清所有细节: http://plnkr.co/edit/x2Jjvm8zwwaLZYV9aLfo?p=preview

答案 1 :(得分:2)

我注意到你的语法中有一个错误:

this.scope = $rootScope.$new;

您没有创建新范围,而是引用$ rootScope的$ new函数。试试这个:

this.scope = $rootScope.$new();