I have a service that calls an external web service:
angular.module('myApp.services', []) .service('autoCmpltDataSvc', function ($http) { var innerMatch = function (data) { return $.map(data, function (item) { return { fullName: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, shortName: item.name, itemId: item.geonameId }; }); }; this.fetchFromGeonamesDb = function (request, response, matcher) { $http({ method: 'jsonp', url: 'http://ws.geonames.org/searchJSON?callback=JSON_CALLBACK', params: { featureClass: "P", style: "full", maxRows: 12, name_startsWith: request.destName } }).success(function (data, status) { console.log(data); response($.map(innerMatch(data.geonames), matcher)); }); }; });
I am trying to verify that it forms the output correctly, so I am mocking the call of a real web service. Here is my unit test.
describe('Services', function () { beforeEach(module('myApp.services')); describe('autoCompleteService', function () { var $httpBackend, svc; var results = []; var matcher = function (item) { return item; }; var response = function (arr) { results = arr; }; beforeEach(inject(function ($injector, autoCmpltDataSvc) { svc = autoCmpltDataSvc; $httpBackend = $injector.get('$httpBackend'); $httpBackend.whenJSONP(/searchJSON/). respond([ { name: 'City1', adminName1: 'Region1', countryName: 'Country1', geonameId: 1 }, { name: 'City2', countryName: 'Country2', geonameId: 2}]); })); afterEach(function () { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); it('should return values', function () { $httpBackend.expectJSONP(/searchJSON/); svc.fetchFromGeonamesDb({ 'destName': 'fra' }, response, matcher); $httpBackend.flush(); expect(results.length).toBe(2); }); }); });
But the test causes an error.
TypeError: Cannot read property 'length' of undefined at Function.v.extend.map (C:/Users/kmukhort/Documents/_files/TMate/A ngularTest/app/lib/jquery-1.8.3.min.js:2:15334) at innerMatch (C:/Users/kmukhort/Documents/_files/TMate/AngularTest/ app/js/services.js:8:18)
I believe something is wrong with the mock answer, as it seems like it is not returning an array. But I can not understand why it does not return an array.
Thanks in advance!