我正在为业力编写单元测试,但无法运行。它似乎正在破坏注入功能。我认为这与我如何在测试中获得控制器有关,但找不到解决方案。
我最近几天才开始使用角度,所以任何建议都将不胜感激,谢谢!
错误:
Error: Argument 'fn' is not a function, got string
at Error (<anonymous>)
at $a (path/app/lib/angular.js:16:453)
at qa (path/app/lib/angular.js:17:56)
at Cb (path/app/lib/angular.js:24:458)
at Object.d [as invoke] (path/app/lib/angular.js:27:66)
at path/app/lib/angular.js:26:194
at Array.forEach (native)
at m (path/app/lib/angular.js:6:192)
at e (path/app/lib/angular.js:25:298)
at Object.sb [as injector] (path/app/lib/angular.js:29:360)
TypeError: Cannot read property 'zip' of undefined
at null.<anonymous> (path/test/unit/controllersSpec.js:26:19)
测试:
'use strict';
/* jasmine specs for controllers go here */
describe('influences controllers', function() {
beforeEach(module('influences.controllers', ['ui.bootstrap', 'influences.services']));
describe('IndividualCtrl', function(){
var scope, ctrl, service, $httpBackend;
beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, Api_sunlight_get) {
console.log('*** IN INJECT!!***: ', Api_sunlight_get);
$httpBackend = _$httpBackend_;
// ignore for now... this is an example of how I might implement this later
// $httpBackend.expectGET('data/products.json').
// respond([{name: 'Celeri'}, {name: 'Panais'}]);
scope = $rootScope.$new();
service = Api_sunlight_get;
ctrl = $controller('IndividualCtrl', {$scope: scope, Api_sunlight_get: service
});
}));
it('should create "products" model with 2 products fetched from xhr', function() {
console.log('*** IN TEST!!***: ', scope);
expect(scope.zip).toEqual(12345);
});
});
});
控制器:
angular
.module('influences.controllers', ['ui.bootstrap', 'influences.services'])
.controller('IndividualCtrl', ['$scope', 'Api_sunlight_get', ($scope, Api_sunlight_get)->
# set default variables
$scope.zip = $scope.zip or 94102 # set default zip if one is not chosen
# Define Methods
$scope.get_rep_data_by_zip = ()->
$scope.reps = Api_sunlight_get "legislators/locate?zip=#{$scope.zip}" $scope.update_rep_data_by_zip
$scope.update_rep_data_by_zip = ()->
$scope.selected_rep = $scope.reps # sets default selection for reps buttons
for rep in $scope.reps
rep.fullname = "" + rep.title + " " + rep.first_name + " " + rep.last_name
# watchers
$scope.$watch('zip', $scope.get_rep_data_by_zip)
# initial run
$scope.get_rep_data_by_zip()
服务:
angular
.module('influences.services', [])
.factory 'Api_sunlight_get', ['$http', ($http)->
return (path, callback)->
$http
url: "http://congress.api.sunlightfoundation.com/#{path}&apikey=xxxx"
method: "GET"
.success (data, status, headers, config)->
callback data.results
.error (data, status, headers, config)->
console.log("Error pulling #{path} from Sunlight API!")
]