我的登录控制器是:
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);
}
});
};
}]);
我的测试是:
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: 'test@email.com',
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});
});
});
在我看来,我有ng-init="init()"
。一切都在前端顺利进行,但在进行测试时,我得到了:
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)
不确定我的测试做错了什么。有什么想法吗?
答案 0 :(得分:4)
是的,您需要先定义toEqualData,例如,Angular tutorial的方式:
beforeEach(function(){
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
答案 1 :(得分:2)
结果显示该行:expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true});
导致错误。没有toEqualData
,所以我正在使用toEqual
而现在正在使用