Reputation: 43639
My login controller is:
angular.module('mean').controller('LoginController', ['$scope', '$location', '$rootScope', 'UserService', function ($scope, $location, $rootScope, UserService) {
$scope.init = function() {
$scope.credentials = {};
$scope.status_object = {
text: '',
class: '',
show: false
};
}
$scope.authenticate = function() {
$scope.status_object = {
text: 'Authenticating...',
class: 'info',
show: true
};
UserService.authenticate($scope.credentials).then(function(response) {
if(response.data.status === 'error') {
$scope.status_object = {
text: response.data.error,
class: 'danger',
show: true
};
} else if(response.data.status === 'ok') {
$rootScope.globals.logged_in = true;
$location.path('/' + response.data.user.access);
}
});
};
}]);
My test is:
describe('LoginController', function() {
beforeEach(module('mean'));
var scope, rootScope, LoginController, $httpBackend, $location;
beforeEach(inject(function($controller, $rootScope, _$httpBackend_, _$location_) {
scope = $rootScope.$new();
rootScope = $rootScope.$new();
LoginController = $controller('LoginController', {
$scope: scope,
$rootScope: rootScope
});
$httpBackend = _$httpBackend_;
$location = _$location_;
}));
it('should show danger when wrong credentials are used', function() {
scope.credentials = {
email: '[email protected]',
password: 'password'
}
$httpBackend.expectPOST('/api/v1/user/auth').respond({
status: 'error',
error: 'Invalid User'
});
console.log(scope.status_object);
scope.authenticate();
$httpBackend.flush();
expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true});
});
});
In my view, I have an ng-init="init()"
. Everything works smoothly on the front end, but when running my test, I get:
PhantomJS 1.9.7 (Mac OS X) LoginController should show danger when wrong credentials are used FAILED
TypeError: 'undefined' is not a function (evaluating 'expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true})')
at /myapp/test/karma/unit/controllers/login.spec.js:43
PhantomJS 1.9.7 (Mac OS X): Executed 4 of 4 (1 FAILED) (0.135 secs / 0.043 secs)
Not sure what my test is doing wrong. Any ideas?
Upvotes: 0
Views: 818
Reputation: 459
Yes, you need to define toEqualData first, for example, the way the Angular tutorial does it:
beforeEach(function(){
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
Upvotes: 4
Reputation: 43639
Turns out the line: expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true});
was causing the error. There is no toEqualData
, so I'm using toEqual
instead and it's working now
Upvotes: 2