0
votes

I need to check two thing here:

  1. The response length. specified the mock data as [{ name: 'John', id: 1 }, { name: 'Josh', id: 2 }] so the response length should be 2. it is failing this test always getting the length as 1.
  2. The response data should be equal. ie. expect(IndexSummaryService.getIndexSummaryQueues).toEqual([{ name: 'John', id: 1 }, { name: 'Josh', id: 2 }]);

The test is failing with Message: Expected Function to equal [object({ name:'john', id:1}), object({ name:'josh', id:2}) ]

My service is bit different which takes api as parameter which is the URL.

Please suggest how to make these unit test working.

This is the service code

    app.service("IndexSummaryService", ['$http', function ($http) {
    this.getIndexSummaryQueues = function (api) {        
        return $http.get(api, { cache: false });
    };
     }]);

This is the controller

 $scope.loadRecords = function (api) {
        $scope.loading = true;
        var GetIndexSummaryQueue = IndexSummaryService.getIndexSummaryQueues(api);
        GetIndexSummaryQueue.then(function (response) {
            $scope.Queues = response.data;
        }, function (error) {
            if (error.status == 500) {
                $scope.errorStatus = "Error " + error.status;
                $scope.errorMsg = error.data.message;
            }
            else {
                $scope.errorStatus = "Error " + error.status;
                $scope.errorMsg = GlobalConstants.errormessage;
            }
            $scope.errorpage = true;
            $scope.success = false;
            console.log("Status Data : " + error.data.message);
            console.log("Status Error : " + error.status);
        }).then(function () {
            $scope.loading = false;
        });
    }

I have written unit test in jasmine below is the jasmine code.

describe("ISummary ->", function () {

beforeEach(function () {
    module("ApplicationModule");
});

var $httpBackend;
var scope, createController;

beforeEach(inject(function ($rootScope, _$httpBackend_, $controller) {
    $httpBackend = _$httpBackend_;
    scope = $rootScope.$new();
    createController = function () {
        return $controller('IndexingSummaryController', {
            $scope: scope
        });
    };       

    $httpBackend.when("GET", "https://domain.com/captivaapi/api/capturestats/pldindexingSummary")
      .respond([{ name: 'John', id: 1 }, { name: 'Josh', id: 2 }]);
}));

afterEach(function () {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});

describe("Service->", function () {
    it("can load topics", inject(function (IndexSummaryService) {          
        $httpBackend.expectGET("https://domain.com/captivaapi/api/capturestats/pldindexingSummary");
        IndexSummaryService.getIndexSummaryQueues('https://domain/captivaapi/api/capturestats/pldindexingSummary');
        $httpBackend.flush();
        expect(IndexSummaryService.getIndexSummaryQueues.length).toBeGreaterThan(0);

        expect(IndexSummaryService.getIndexSummaryQueues.length).toEqual(2);

        expect(IndexSummaryService.getIndexSummaryQueues).toEqual([{ name: 'John', id: 1 }, { name: 'Josh', id: 2 }]);
    }));
});
1

1 Answers

1
votes

You're not testing the response of the promise, try the below (might not be exact as it's been a while since I used Angular, but basically make your assertions in a then block, once the promise has resolved).

describe("Service->", function () {
    it("can load topics", inject(function (IndexSummaryService) {          
        $httpBackend.expectGET("https://domain.com/captivaapi/api/capturestats/pldindexingSummary");

        IndexSummaryService.getIndexSummaryQueues('https://domain/captivaapi/api/capturestats/pldindexingSummary').then(function(res) {
            expect(res.length).toBeGreaterThan(0);
            expect(res.length).toEqual(2);
            expect(res).toEqual([{ name: 'John', id: 1 }, { name: 'Josh', id: 2 }]);
        });
        $httpBackend.flush();
    }));
});