简体   繁体   中英

How to test an http request in my case?

I have a service like this.

It is simply just make a http get request.

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);
            }            
        };
    }
]);

Within my controller, I have called the service

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

I need to write the unit test for it

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)
    });
 }));

After running the test, I got

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

How do I write the test to make sure it passes? Any ideas? Thanks a lot!

Your variable "id" seems to be undefined. If you throw in

var id = 123; 

before this line:

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

It would call /api/product/123 instead.

So maybe you were looking for this in the first place:

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

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

And so on... Hope it helps!

Try putting single quotes around the object that's passed into $http, ie $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);
            }            
        };
    }
]);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM