Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
152
rated 0 times [  155] [ 3]  / answers: 1 / hits: 17784  / 10 Years ago, wed, september 10, 2014, 12:00:00

I'm unable to get my unit test to work properly. I have a $scope array that starts out empty, but should be filled with an $http.get(). In the real environment, there'd be approx 15 or so objects in the array, but for my unit test I just grabbed 2. For the unit test, I have:



expect($scope.stuff.length).toBe(2);


But jasmine's error is: Expected 0 to be 2.



here's my controller.js:



$scope.stuff = [];
$scope.getStuff = function () {
var url = site.root + 'api/stuff';
$http.get(url)
.success(function (data) {
$scope.stuff = data;
})
.error(function(error) {
console.log(error);
});
};


and my controller.spec.js is:



/// <reference path=../../../scripts/angular-loader.min.js />
/// <reference path=../../../scripts/angular.min.js />
/// <reference path=../../../scripts/angular-mocks.js />
/// <reference path=../../../scripts/angular-resource.js />
/// <reference path=../../../scripts/controller.js />
beforeEach(module('ui.router'));
beforeEach(module('ngResource'));
beforeEach(module('ngMockE2E'));
beforeEach(module('myApplication'));
var $scope;
var controller;
var httpLocalBackend;

beforeEach(inject(function ($rootScope, $controller, $injector) {
$scope = $rootScope.$new();
controller = $controller(StuffController, {
$scope: $scope
});
}));

beforeEach(inject(function ($httpBackend) {
httpLocalBackend = $httpBackend;
}));

it('should get stuff', function () {
var url = '/api/stuff';
var httpResponse = [{ stuffId: 1 }, { stuffId: 2 }];
httpLocalBackend.expectGET(url).respond(200, httpResponse);
$scope.getStuff();
expect($scope.stuff.length).toBe(2);
//httpLocalBackend.flush();
} );


Now, obviously, I changed variable names and such since this is for work, but hopefully this is enough information for anybody to help me. I can provide more if needed. I also get a second error when uncommenting the .flush() line, but I'll get to that a bit later.



Any help is greatly appreciated and thanks in advance!



EDIT:



Finally got it working! Here's my final code:



it('should get stuff', function () {
var url = '/api/stuff';
var httpResponse = [{ stuffId: 1 }, { stuffId: 2 }];
httpLocalBackend.expectGET(url).respond(200, httpResponse);
$scope.getStuff();
httpLocalBackend.flush();
expect($scope.stuff.length).toBe(2);
} );


EDIT 2:
I ran into another problem, which I think may have been the root cause of this. See Unit test failing when function called on startup


More From » angularjs

 Answers
21

You need to place httpLocalBackend.flush() statement before expect($scope.stuff.length).toBe(2). Once you make a request you need to flush it for the data to be available in your client code.



it('should get stuff', function () {
var url = '/api/roles';
var httpResponse = [{ stuffId: 1 }, { stuffId: 2 }];
scope.getStuff(); //Just moved this from after expectGET
httpLocalBackend.expectGET(url).respond(200, httpResponse);
httpLocalBackend.flush();
expect($scope.stuff.length).toBe(2);
} );


Try this.


[#69501] Monday, September 8, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
stacie

Total Points: 476
Total Questions: 92
Total Answers: 102

Location: Bosnia and Herzegovina
Member since Tue, Mar 29, 2022
2 Years ago
stacie questions
Fri, Jun 26, 20, 00:00, 4 Years ago
Thu, Jan 23, 20, 00:00, 4 Years ago
Fri, Aug 30, 19, 00:00, 5 Years ago
Fri, Aug 2, 19, 00:00, 5 Years ago
;