0

该应用程序上的所有内容都运行良好,因此只是我的测试在语法上不正确。这是我正在使用的截断版本。名称和位置已更改以保护无辜者。

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'

奇怪的!因为我的整个应用程序都可以正常工作并蓬勃发展,因为该方法可以完美运行。所以一定是我没有正确注入这个模块(猜测!)。

4

2 回答 2

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 或其他东西转换而来的(充满了回报和这个),所以我不确定我是否做对了。

Finally, a working plunk, hopefully this one will clarify all the details: http://plnkr.co/edit/x2Jjvm8zwwaLZYV9aLfo?p=preview

于 2013-02-02T20:12:46.867 回答
2

我注意到这一行的语法有一个错误:

this.scope = $rootScope.$new;

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

this.scope = $rootScope.$new();
于 2013-02-02T20:03:06.627 回答