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上,它将被消除。但同样的问题仍在继续