gpt4 book ai didi

angularjs - 带有服务注入(inject)的测试 Controller

转载 作者:行者123 更新时间:2023-11-28 20:54:07 24 4
gpt4 key购买 nike

我目前正在测试我的 AngularJS 应用程序,我正在为注入(inject)服务的 Controller 测试而苦苦挣扎。

这是我的 Controller :

.controller('UserCtrl', ['$scope', '$routeParams', 'User', function ($scope, $routeParams, User) {

$scope.hello = "lol";

$scope.userId = $routeParams.id;
var user = new User($scope.userId);

$scope.load = function(){
user.load().then(
function(user){
$scope.name = user.name;
},
function() {
$scope.dataFail = 'error error' ;
}
);
};

$scope.load();
}]);

这是我的用户服务(我想在我的 Controller 测试中注入(inject))

.factory('user', ['$http', '$q', function ($http, $q) {

var User = function (id) {
this.id = id;
this.name = null;
};

User.prototype.load = function () {
var deferred = $q.defer();

$http.post('/user/' + this.id + '/load')
.success(function(data) {
var user = new User(data.id);
user.name = data.name
deferred.resolve(user);
})
.error(function(err, code) {
deferred.reject(err);
$log.error(err, code);
});
return deferred.promise;
};

return User;

最后是我的测试:

describe('Controller: UserCtrl', function () {

var $controller, $scope, User;

beforeEach(module('octosendApp', function($provide){
User = jasmine.createSpyObj('User', ['load']);

User.load.and.returnValue({
name: 'testName'
});
$provide.value('User', User);
}));

beforeEach(inject(function(_$controller_, $rootScope, _User_){
$scope = $rootScope.$new();
User = _User_;

$controller = _$controller_('UserCtrl', {
$scope: $scope,
User : User,
$routeParams: {id: 2}
});
}));

it('should have a hello property', function() {
expect($scope.hello).toBeDefined();
});

});

我收到以下错误:

TypeError: '[object Object]' is not a constructor (evaluating 'new User($scope.userId)')

我想问题是因为我的工厂是面向对象的,我不能使用构造函数。我遵循了这个教程:https://vimeo.com/90938739并且完全相同,唯一的区别是工厂的结构,我不想改变。

感谢您的帮助。

最佳答案

问题出在这一行,因为 User 应该是构造函数而不是对象。

User = jasmine.createSpyObj('User', ['load']);

下面是如何对构造函数进行模拟。

// mock constructor
var UserMock = function () {
// do some mocking..
}
User = jasmine.createSpy('User').and.callFake(UserMock);
$provide.value('User', User);

关于angularjs - 带有服务注入(inject)的测试 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com