我在调整this test以使用"控制器作为"时遇到了一些麻烦。句法。这就是我所拥有的......
我正在测试的控制器是:
function MyCtrl ($scope, someService) {
someService.get()
.success(function(data){
$scope.person = data;
});
}
angular.module('myApp')
.controller('MyCtrl', MyCtrl);
单元测试是:
beforeEach(module('myApp'));
var scope,
fakeService,
controller,
q,
deferred;
beforeEach(function () {
fakeService = {
get: function () {
deferred = q.defer();
deferred.resolve({ "test": "data" });
return deferred.promise;
}
};
spyOn(fakeService, 'get').and.callThrough();
});
beforeEach(inject(function ($controller, $q, $rootScope) {
q = $q;
scope = $rootScope.$new();
controller = $controller('MyCtrl as person', { $scope: scope, someService: fakeService });
}));
it('The person object is not defined yet', function () {
expect(scope.person).not.toBeDefined();
});
scope.person
的此测试失败,错误为TypeError: undefined is not a function
。
我已尝试this solution我已将expect(scope.person)
更改为expect(scope)
,但会返回TypeError: undefined is not a function
。
我使用的是AngularJS 1.2.22,Karma 0.12.21和karma-jamsine插件的0.2.2。
提前感谢您提出的任何建议。
答案 0 :(得分:0)
除了@JBNizet指出的fakePwsService != fakeService
。
$q.defer()
创建的承诺没有success()
方法。
.success()
和.error()
方法是由$http
服务本身添加的特殊方法。
因此,如果您想以这种方式嘲笑someService
,您还必须自己模仿.success()
。
fakePwsService = {
get: function () {
deferred = q.defer();
deferred.resolve({ "test": "data" });
var promise = deferred.promise;
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.error = function(fn) {
promise.then(null, function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
return promise;
}
};
以上代码是从http.js#L743复制的。
PS。此问题与“控制器为”语法无关。