Javascript 棱角形/茉莉花:can';测试时无法获得通过的值
我写了一个允许我更改密码的页面。代码工作正常,它完成了我想要它做的一切,所以我开始编写测试。由于我在角度测试方面没有经验,这已经证明是相当困难的,我无法通过此错误:Javascript 棱角形/茉莉花:can';测试时无法获得通过的值,javascript,angularjs,testing,karma-runner,karma-jasmine,Javascript,Angularjs,Testing,Karma Runner,Karma Jasmine,我写了一个允许我更改密码的页面。代码工作正常,它完成了我想要它做的一切,所以我开始编写测试。由于我在角度测试方面没有经验,这已经证明是相当困难的,我无法通过此错误: TypeError: 'undefined' is not an object (evaluating 'plan.apply') at /Users/denniegrondelaers/asadventure/myproject-web/src/users/controllers/userPasswordControlle
TypeError: 'undefined' is not an object (evaluating 'plan.apply')
at /Users/denniegrondelaers/asadventure/myproject-web/src/users/controllers/userPasswordController.js:9
at /Users/denniegrondelaers/asadventure/myproject-web/test/unitTests/specs/users/controllers/userPasswordControllerSpec.js:98
控制员:
userPasswordController.js
users.controllers.controller('userPasswordController',
['$scope', 'Session', '$state', 'UserService', 'languages',
function ($scope, Session, $state, UserService, languages) {
$scope.languages = languages;
$scope.password = "";
$scope.notEqual = false;
$scope.isSuccessful = false;
$scope.changePassword = function() {
var pw = {
userId: Session.getCurrentSession().userId,
oldPassword: encrypt($scope.password.oldPassword),
newPassword: encrypt($scope.password.newPassword),
newPasswordRepeat: encrypt($scope.password.newPasswordRepeat)
};
if (pw.newPassword === pw.newPasswordRepeat) {
$scope.notEqual = false;
UserService.setNewPassword(pw).then(function(res) {
$scope.formErrors = undefined;
$scope.isSuccessful = true;
}, function (error) {
$scope.formErrors = error.data;
}
);
} else {
$scope.notEqual = true;
}
};
var encrypt = function (password) {
var encrypted = CryptoJS.md5(password);
return encrypted.toString(CryptoJS.enc.Hex);
};
}
]
);
服务:
userService.js
userService.setNewPassword = function (password) {
return $http
.put(EnvironmentConfig.endpointUrl +
"/password/change", password)
};
测试:
userPasswordControllerSpec.js
describe('Users', function () {
describe('Controllers', function () {
fdescribe('userPasswordController', function () {
var $scope,
controller,
$q,
willResolve,
mockSession,
mockState,
mockUserService,
mockLanguages;
beforeEach(function () {
module('mysite.users.controllers');
module(function ($provide) {
$provide.value('translateFilter', function (a) {
return a;
});
$provide.value('$state', function (a) {
return a;
});
});
mockSession = {
getCurrentSession: function () {
return {userId: 4};
}
};
mockState = {
params: {
id: 1
},
go: function () {
}
};
mockLanguages = {
getLanguages : function () {
var deferred = $q.defer();
deferred.resolve({
data: [{}]
});
return deferred.promise;
}
};
mockUserService = {
setNewPassword : function () {
var deferred = $q.defer();
if (willResolve) {
deferred.resolve({
data: [{}]
});
}
return deferred.promise;
}
};
inject(function (_$q_, $controller, $rootScope) {
controller = $controller;
$q = _$q_;
$scope = $rootScope.$new();
});
controller('userPasswordController', {$scope: $scope, Session: mockSession, $state: mockState,
UserService: mockUserService, languages: mockLanguages
});
willResolve = true;
});
it('should change password', function () {
spyOn(mockUserService, 'setNewPassword').and.callThrough();
spyOn(mockState, 'go').and.callThrough();
spyOn(mockSession, 'getCurrentSession').and.callFake();
expect(mockUserService.setNewPassword).not.toHaveBeenCalled();
expect($scope.isSubmitable()).not.toBeTruthy();
$scope.compareStoreSelection = function () {
return true;
};
$scope.password = {
oldPassword: "123456",
newPassword: "password",
newPasswordRepeat: "password"
};
expect($scope.isSubmitable()).toBeTruthy();
>>> $scope.changePassword(); <<< LOCATION OF ERROR, line 98
expect(mockUserService.setNewPassword).toHaveBeenCalled();
$scope.$apply();
});
});
});
});
description('Users',function(){
描述('Controllers',function(){
fdescribe('userPasswordController',函数(){
var$scope,
控制器,
$q,
决心,
第二届会议,
莫克州,
mockUserService,
模仿语言;
beforeach(函数(){
模块('mysite.users.controllers');
模块(功能($提供){
$provide.value('translateFilter',函数(a){
返回a;
});
$provide.value(“$state”,函数(a){
返回a;
});
});
模拟会话={
getCurrentSession:函数(){
返回{userId:4};
}
};
模拟状态={
参数:{
身份证号码:1
},
go:函数(){
}
};
模拟语言={
getLanguages:函数(){
var deferred=$q.deferred();
推迟,解决({
数据:[{}]
});
回报。承诺;
}
};
mockUserService={
setNewPassword:函数(){
var deferred=$q.deferred();
如果(将解决){
推迟,解决({
数据:[{}]
});
}
回报。承诺;
}
};
注入(函数($q_$controller,$rootScope){
控制器=$controller;
$q=$q;
$scope=$rootScope.$new();
});
控制器('userPasswordController',{$scope:$scope,会话:mockSession,$state:mockState,
UserService:mockUserService,语言:mockLanguages
});
willResolve=true;
});
它('应该更改密码',函数(){
spyOn(mockUserService,'setNewPassword')。和.callThrough();
spyOn(mockState,'go')。和.callThrough();
spyOn(mockSession,'getCurrentSession')。和.callFake();
expect(mockUserService.setNewPassword).not.toHaveBeenCalled();
expect($scope.isSubmitable()).not.toBeTruthy();
$scope.compareStoreSelection=函数(){
返回true;
};
$scope.password={
旧密码:“123456”,
新密码:“密码”,
newPasswordRepeat:“密码”
};
expect($scope.isSubmitable()).toBeTruthy();
>>>$scope.changePassword();不知道它是否相关,但为什么你在监视mockSession.getCurrentSession
而不是callThrough
时要callFake
?实际上,这让我的测试运行起来了。这是我同事的临时建议,我忘了纠正。非常感谢!不知道它是否相关,但你为什么callFake
在监视mockSession.getCurrentSession
而不是callThrough
时?实际上,这让我的测试运行了。这是我同事的临时建议,我忘记了纠正。非常感谢!