如何在我的情况下测试http请求?

时间:2015-02-09 23:59:53

标签: javascript angularjs unit-testing

我有这样的服务。

这只是一个http get请求。

angular.module('myApp').service('TESTService', ['$http',
    function($http) {
        var request = function(url) {
            return $http({
                method: 'GET',
                url: url
            });
        };
        return {
            get: function(url) {
                return request(url);
            }            
        };
    }
]);

在我的控制器中,我已经调用了服务

 TESTService.get('/api/product' + id).success(
            function(result) {
                console.log(result)
            }
        );

我需要为它编写单元测试

describe('test here', function () {
var testCtrl, scope, httpBackend, testService;

// Initialize the controller and a mock scope
beforeEach(inject(function (_$controller_, _$rootScope_, _$httpBackend_,  _TESTService_) {
    scope = _$rootScope_.$new();
    httpBackend = _$httpBackend_;
    testService = _TESTService_;

    testCtrl = _$controller_('testCtrl', {
        $scope: scope
    });



     it('should return http data', function() {
        var productData = {
           data: [
                {
                  obj: {
                    id:'123'
                  }
                }           
            ]
        }

        httpBackend.expectGET('/api/product/' + id).respond(productData);

        TESTService.get('/api/product/' + id).
            then(function(data) {
                var result = data;
            })

        httpBackend.flush();
        expect(result).toEqual(productData)
    });
 }));

运行测试后,我得到了

Error: Unexpected request: GET /api/product/undefined

如何编写测试以确保测试通过?有任何想法吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

你的变量" id"似乎未定义。如果你投入

var id = 123; 

在此之前:

httpBackend.expectGET('/api/product/' + id).respond(productData);

它会调用/ api / product / 123。

所以也许你一开始就在寻找这个:

 httpBackend.expectGET('/api/product/' + productData.data[0].obj.id).respond(productData);

 TESTService.get('/api/product/' + productData.data[0].obj.id).

等等......希望它有所帮助!

答案 1 :(得分:0)

尝试在传递给$ http的对象周围放置单引号,即$ http({method:'GET','url',url});

angular.module('myApp').service('TESTService', ['$http',
    function($http) {
        var request = function(url) {
            return $http({
                method: 'GET',
                'url': url
            });
        };
        return {
            get: function(url) {
                return request(url);
            }            
        };
    }
]);