6

我正在尝试在我的 Angular 框架中测试控制器:

.controller('UserCtrl', ['$scope', '$location', 'User', 'Config',
    function ($scope, $location, User, Config) {
       ...
    }])

这个控制器依赖于几个需要 $http 对象来进行服务器调用的服务:

.factory('User', ['$http', function ($http) {
    var data = {};

    return {
        query: function(oper, putdata, callback){
            if(oper == 'get'){
            $http.get(getUrl("user",null)).success(function(data2) {
                console.log(data2);

                callback(data2);
                data.userinfo = data2;
            });
            },

        userinfo: data
    };
}])

但是当我尝试引导控制器时,我无法让 httpBackend 工作:

describe('UserCtrl', function(){

    var ctrlScope, ctrl, $httpBackend, controllerService;

    beforeEach(
        inject(function($httpBackend, $http, $rootScope, $controller, User, Config) {
            _User = User;
            _Config = Config;
            spyOn(User, 'getUserInfo').andCallThrough();
            //spyOn(User, 'query').andCallThrough();

            ctrlScope = $rootScope.$new();
            controllerService = $controller;
            httpMock = $httpBackend;

        })
    );

    it('should create setup userinfo object ', function() {
        httpMock.expectGET("/user/default/details").
            respond({somejson});

        ctrl = controllerService('UserCtrl', {$scope: ctrlScope, $location: location, User: _User, Config: _Config});
        expect(_User.getUserInfo).toHaveBeenCalled();
        httpMock.flush();
        expect(ctrlScope.userinfo.length).toBe(1);

    });
});

我得到的只是:

Error: No pending request to flush !

那么是否可以将 httpBackend 与您从正在测试的控制器调用的服务一起使用?

4

1 回答 1

1

您是否有理由要专门测试 GET 请求?这是您的用户服务的实现细节。

无论您的函数是调用 query() 还是 getUserInfo(),我怀疑您真正想知道的只是该函数是在您的用户服务上调用的。用户服务有自己的测试集来测试是否向 /user/defaults/details 发出了 GET 请求。

这背后的原因是,当您更改用户服务的实现时,您不希望不相关的单元测试中断。当您的 API 更改为 时会发生什么/user/query?您的 UserCtrl 测试不应中断,任何其他使用用户服务的控制器也不应中断。如果您的 UserCtrl 在用户服务上调用 getUserInfo() ,那么就您而言,它正在做正确的事情。您的用户服务单元测试将中断,一旦您将它们修复为指向您的新 URL,一切都会恢复正常。

于 2013-08-06T19:07:52.740 回答