应用程序上的所有内容都可以正常工作,所以它只是我的语法不正确的测试。这是我正在使用的截断版本。名称和位置已经改变,以保护无辜者。
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'
奇怪!因为我的整个应用程序都能正常运行,并且这种方法可以完美运行。所以一定是我没有正确地注入这个模块(猜测!)。
答案 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();