Angularjs 用于测试控制器的模拟角度服务
让我先介绍一下情况 这是我的角度代码Angularjs 用于测试控制器的模拟角度服务,angularjs,rest,maven,unit-testing,jasmine,Angularjs,Rest,Maven,Unit Testing,Jasmine,让我先介绍一下情况 这是我的角度代码 //this is my controller function viewUserProfile($scope, $http, svcUserInfo) { svcUserInfo.userInfo(null, function(data) { $scope.profile = loadProfile(data); }, function() { Console.log('Error getting User
//this is my controller
function viewUserProfile($scope, $http, svcUserInfo) {
svcUserInfo.userInfo(null, function(data) {
$scope.profile = loadProfile(data);
}, function() {
Console.log('Error getting User info.');
});
}
所以基本上我只是使用svcUserInfo REST服务在$scope.profile上加载一个profile对象,例如first name、last name等
服务的创建方式如下:
anythingHere.factory('svcUserInfo', ['$resource', function($resource) {
return $resource(SVC_USER, null, {
userInfo: {method: 'GET'}
});
}]);
现在这一个工作得很好,所以只需在这些代码之前和之后假设其他声明或初始化
现在我在这里使用jasmine maven插件编写测试代码
我想要实现的是用$scope.profile模拟服务并填充它。这就是我到目前为止所做的:
describe('User Profile Controller', function() {
var rootScope, scope,
location = {}, route = {}, http = {}, userProfCtrl,
mockSvcUserInfo, userInfoPromise;
beforeEach(module('myApp'));
beforeEach(module(MOD_USERPROF));
beforeEach(module(function($provide){
$provide.factory('svcUserInfo', ['$q', function($q) {
var profile = {
nameType: 'Personal Name',
firstName: 'Joseph',
lastName: 'Bada',
email: 'email@email.com',
hasReferrer: false,
referrer: null,
country: 'myCountry',
state: 'myState',
city: 'myCIty',
address1: 'this is address1',
address2: 'this is address2',
zipcode: '9999',
phone: '+191234567',
maxProduct: '2'
};
function userInfo(data){
if(userInfoPromise){
return $q.when(profile);
} else {
return $q.reject();
}
}
return{
userInfo: userInfo
};
}]);
}));
beforeEach(inject(function($rootScope, $controller, svcUserInfo){
scope = $rootScope.$new();
rootScope = $rootScope.$new();
mockSvcUserInfo = svcUserInfo;
spyOn(mockSvcUserInfo, 'userInfo').and.callThrough();
userProfCtrl = $controller(CTRL_USERPROF, {
$scope: scope,
svcUserInfo: mockSvcUserInfo,
$rootScope: rootScope
});
}));
it('should call the rest service for User Profile and populate profile', function() {
userInfoPromise = true;
scope.$digest();
rootScope.$digest();
expect(mockSvcUserInfo.userInfo).toHaveBeenCalled();
expect(scope.profile).not.toBe(undefined); // or undefined anything like these
it("profile object: " + JSON.stringify(scope.profile)); // this is for debugging purposes so that i can check if scope.profile has values or not.
});
});
现在在规范中,我希望在调用mockSvcUserInfo.user之后。
然后必须填充/初始化scope.profile,因为根据我在控制器上的代码,在成功调用服务时,必须填充$scope.profile。
到目前为止,这样做的结果是scope.profile未定义
我的测试代码基于此:
请帮帮我,谢谢
编辑
我已经更新了第一个答案的代码
it('should call the rest service for User Profile', inject(function($rootScope,$controller,svcUserInfo) {
scope = $rootScope.$new();
rootScope = $rootScope.$new();
userInfoPromise = true;
mockSvcUserInfo = svcUserInfo;
spyOn(mockSvcUserInfo, 'userInfo').and.callThrough();
userProfCtrl = $controller(CTRL_USERPROF, {
$scope: scope,
svcUserInfo: mockSvcUserInfo,
$rootScope: rootScope
});
scope.$digest();
rootScope.$digest();
expect(mockSvcUserInfo.userInfo).toHaveBeenCalled();
expect(scope.profile).not.toBe([]);
it("hello" + JSON.stringify(scope.profile));
}));
仍然scope.profile未定义我想我知道问题所在 在测试中将userInfoPromise设置为true,但控制器是在设置过程中创建的,在设置布尔值时,服务调用完成
可以在每次测试之前在内部设置userInfoPromise,也可以将控制器创建移到测试中。您可以在浏览器中像普通js代码一样调试代码。放置断点,看看控制器函数是否实例化。我不知道怎么做。我在命令提示符mvn clean install上运行测试。这也是问题之一,我无法很好地查看调试测试。从karma打开的浏览器中,单击调试按钮。新选项卡\窗口将运行您的测试。打开开发人员控制台,在“源”选项卡中选择控制器脚本,并在控制器上放置断点。刷新页面。伙计,我刚刚尝试了你的建议,但没有进入服务,来自控制器,我的$PROFECT模块正确吗$问:休息服务?可以吗?老兄,谢谢你的回答。如果你是这样描述的,请检查我的编辑。但是scope.profile是未定义的,我也尝试过userInfo只返回$q.whenprofile,所以如果问题出在var userInfoPromise上,它将被消除。但同样的问题仍在继续