Javascript 因果报应、茉莉花、未可知的错误:<;已被催缴的时间>;:应为间谍,但未经测试就获得了功能
先为我的英语不好道歉 我正在用Karma和Jasmine测试我的应用程序,我有一个非常奇怪的错误Javascript 因果报应、茉莉花、未可知的错误:<;已被催缴的时间>;:应为间谍,但未经测试就获得了功能,javascript,angularjs,unit-testing,karma-jasmine,spy,Javascript,Angularjs,Unit Testing,Karma Jasmine,Spy,先为我的英语不好道歉 我正在用Karma和Jasmine测试我的应用程序,我有一个非常奇怪的错误 我有9个测试,当我运行测试时,karma似乎找到了第10个测试。因果报应给了我一个错误: 未捕获错误::预期为间谍,但获得函数 奇怪的是:当我在调试模式下启动测试时。一切都很好 更奇怪的是,我有3个文件。当我同时执行3个文件时发生错误。有两个文件都很好^^ 你已经看到这个错误了吗 我会给你两个屏幕。首先,没有调试模式。第二种调试模式。我会给你我的密码。 .png .png 激活.contr
我有9个测试,当我运行测试时,karma似乎找到了第10个测试。因果报应给了我一个错误: 未捕获错误::预期为间谍,但获得函数 奇怪的是:当我在调试模式下启动测试时。一切都很好
更奇怪的是,我有3个文件。当我同时执行3个文件时发生错误。有两个文件都很好^^ 你已经看到这个错误了吗 我会给你两个屏幕。首先,没有调试模式。第二种调试模式。我会给你我的密码。
.png
.png
激活.controller.js
describe('userActivateCtrl', function() {
beforeEach(module('Betizy'));
var $controller;
beforeEach(inject(function(_$controller_, _ngToast_, _$filter_, _userService_, _navigationService_){
$controller = _$controller_;
ngToast = _ngToast_;
$filter = _$filter_;
userService = _userService_;
navigationService = _navigationService_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userActivateCtrl', {
});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.activate.message'));
})
});
describe('for a valid registration', function () {
it("call method from userService when activation is called by the click on activation button.", function () {
var fakeHttpPromise = {
then: function () {}
};
var controller = $controller('userActivateCtrl', {
});
controller.userActivateForm = {$valid: true};
spyOn(userService, 'activate').and.returnValue(fakeHttpPromise);
spyOn(navigationService, 'toIndex').and.returnValue(fakeHttpPromise);
controller.activate();
expect(userService.activate).toHaveBeenCalledTimes(1);
setTimeout(function () {
expect(navigationService.toIndex).toHaveBeenCalledTimes(1);
done();
})
})
});
describe('for an invalid activation form', function () {
it("does nothing.", function () {
var controller = $controller('userActivateCtrl', {
});
var fakeHttpPromise = {
then: function () {}
};
controller.userActivateForm = {$valid: false};
spyOn(userService, 'activate').and.returnValue(fakeHttpPromise);
ngToast.dismiss();
controller.activate();
expect(ngToast.messages.length).toBe(0);
expect(userService.activate).not.toHaveBeenCalled();
})
});
});
describe('userLoginCtrl', function() {
beforeEach(module('Betizy'));
beforeEach(inject(function (_$controller_, _$stateParams_, _ngToast_, _$filter_) {
$controller = _$controller_;
$stateParams = _$stateParams_;
ngToast = _ngToast_;
$filter = _$filter_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userLoginCtrl', {});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.login.message'));
});
it('add an danger toast in the toastList if user was mistaken during authentication.', function () {
$stateParams.state = "error";
var controller = $controller('userLoginCtrl', {});
expect(ngToast.messages.length).toBe(2);
expect(ngToast.messages[0].className).toBe('danger');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.login.error'));
});
});
});
describe('userRegisterCtrl', function(){
beforeEach(module('Betizy'));
var $controller;
beforeEach(inject(function(_$controller_, _userService_, _ngToast_, _$filter_, _navigationService_){
$controller = _$controller_;
userService = _userService_;
ngToast = _ngToast_;
$filter = _$filter_;
navigationService = _navigationService_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userRegisterCtrl', {
});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.register.message'));
})
});
describe('for a valid registration', function () {
it("call method from userService when register is called by the click on register button.", function () {
var fakeHttpPromise = {
then: function () {}
};
var controller = $controller('userRegisterCtrl', {
});
controller.userRegisterForm = {$valid: true};
spyOn(userService, 'register').and.returnValue(fakeHttpPromise);
spyOn(navigationService, 'toIndex').and.returnValue(fakeHttpPromise);
controller.register();
expect(userService.register).toHaveBeenCalledTimes(1);
setTimeout(function () {
expect(navigationService.toIndex).toHaveBeenCalledTimes(1);
done();
})
})
});
describe('for an invalid registration with invalid mail adress', function () {
it("add a danger toast in the toastList for an incorrect mail adress pattern.", function () {
var controller = $controller('userRegisterCtrl', {
});
controller.userRegisterForm = {$error: {email: true}, $valid: false};
ngToast.dismiss();
controller.register();
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('danger');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.register.error.email.pattern'));
})
});
describe('for an invalid registration and a valid mail adress', function () {
it("does nothing.", function () {
var controller = $controller('userRegisterCtrl', {
});
var fakeHttpPromise = {
then: function () {}
};
controller.userRegisterForm = {$error: {email: false}, $valid: false};
spyOn(userService, 'register').and.returnValue(fakeHttpPromise);
ngToast.dismiss();
controller.register();
expect(ngToast.messages.length).toBe(0);
expect(userService.register).not.toHaveBeenCalled();
})
});
});
login.controller.js
describe('userActivateCtrl', function() {
beforeEach(module('Betizy'));
var $controller;
beforeEach(inject(function(_$controller_, _ngToast_, _$filter_, _userService_, _navigationService_){
$controller = _$controller_;
ngToast = _ngToast_;
$filter = _$filter_;
userService = _userService_;
navigationService = _navigationService_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userActivateCtrl', {
});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.activate.message'));
})
});
describe('for a valid registration', function () {
it("call method from userService when activation is called by the click on activation button.", function () {
var fakeHttpPromise = {
then: function () {}
};
var controller = $controller('userActivateCtrl', {
});
controller.userActivateForm = {$valid: true};
spyOn(userService, 'activate').and.returnValue(fakeHttpPromise);
spyOn(navigationService, 'toIndex').and.returnValue(fakeHttpPromise);
controller.activate();
expect(userService.activate).toHaveBeenCalledTimes(1);
setTimeout(function () {
expect(navigationService.toIndex).toHaveBeenCalledTimes(1);
done();
})
})
});
describe('for an invalid activation form', function () {
it("does nothing.", function () {
var controller = $controller('userActivateCtrl', {
});
var fakeHttpPromise = {
then: function () {}
};
controller.userActivateForm = {$valid: false};
spyOn(userService, 'activate').and.returnValue(fakeHttpPromise);
ngToast.dismiss();
controller.activate();
expect(ngToast.messages.length).toBe(0);
expect(userService.activate).not.toHaveBeenCalled();
})
});
});
describe('userLoginCtrl', function() {
beforeEach(module('Betizy'));
beforeEach(inject(function (_$controller_, _$stateParams_, _ngToast_, _$filter_) {
$controller = _$controller_;
$stateParams = _$stateParams_;
ngToast = _ngToast_;
$filter = _$filter_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userLoginCtrl', {});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.login.message'));
});
it('add an danger toast in the toastList if user was mistaken during authentication.', function () {
$stateParams.state = "error";
var controller = $controller('userLoginCtrl', {});
expect(ngToast.messages.length).toBe(2);
expect(ngToast.messages[0].className).toBe('danger');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.login.error'));
});
});
});
describe('userRegisterCtrl', function(){
beforeEach(module('Betizy'));
var $controller;
beforeEach(inject(function(_$controller_, _userService_, _ngToast_, _$filter_, _navigationService_){
$controller = _$controller_;
userService = _userService_;
ngToast = _ngToast_;
$filter = _$filter_;
navigationService = _navigationService_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userRegisterCtrl', {
});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.register.message'));
})
});
describe('for a valid registration', function () {
it("call method from userService when register is called by the click on register button.", function () {
var fakeHttpPromise = {
then: function () {}
};
var controller = $controller('userRegisterCtrl', {
});
controller.userRegisterForm = {$valid: true};
spyOn(userService, 'register').and.returnValue(fakeHttpPromise);
spyOn(navigationService, 'toIndex').and.returnValue(fakeHttpPromise);
controller.register();
expect(userService.register).toHaveBeenCalledTimes(1);
setTimeout(function () {
expect(navigationService.toIndex).toHaveBeenCalledTimes(1);
done();
})
})
});
describe('for an invalid registration with invalid mail adress', function () {
it("add a danger toast in the toastList for an incorrect mail adress pattern.", function () {
var controller = $controller('userRegisterCtrl', {
});
controller.userRegisterForm = {$error: {email: true}, $valid: false};
ngToast.dismiss();
controller.register();
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('danger');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.register.error.email.pattern'));
})
});
describe('for an invalid registration and a valid mail adress', function () {
it("does nothing.", function () {
var controller = $controller('userRegisterCtrl', {
});
var fakeHttpPromise = {
then: function () {}
};
controller.userRegisterForm = {$error: {email: false}, $valid: false};
spyOn(userService, 'register').and.returnValue(fakeHttpPromise);
ngToast.dismiss();
controller.register();
expect(ngToast.messages.length).toBe(0);
expect(userService.register).not.toHaveBeenCalled();
})
});
});
register.controller.js
describe('userActivateCtrl', function() {
beforeEach(module('Betizy'));
var $controller;
beforeEach(inject(function(_$controller_, _ngToast_, _$filter_, _userService_, _navigationService_){
$controller = _$controller_;
ngToast = _ngToast_;
$filter = _$filter_;
userService = _userService_;
navigationService = _navigationService_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userActivateCtrl', {
});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.activate.message'));
})
});
describe('for a valid registration', function () {
it("call method from userService when activation is called by the click on activation button.", function () {
var fakeHttpPromise = {
then: function () {}
};
var controller = $controller('userActivateCtrl', {
});
controller.userActivateForm = {$valid: true};
spyOn(userService, 'activate').and.returnValue(fakeHttpPromise);
spyOn(navigationService, 'toIndex').and.returnValue(fakeHttpPromise);
controller.activate();
expect(userService.activate).toHaveBeenCalledTimes(1);
setTimeout(function () {
expect(navigationService.toIndex).toHaveBeenCalledTimes(1);
done();
})
})
});
describe('for an invalid activation form', function () {
it("does nothing.", function () {
var controller = $controller('userActivateCtrl', {
});
var fakeHttpPromise = {
then: function () {}
};
controller.userActivateForm = {$valid: false};
spyOn(userService, 'activate').and.returnValue(fakeHttpPromise);
ngToast.dismiss();
controller.activate();
expect(ngToast.messages.length).toBe(0);
expect(userService.activate).not.toHaveBeenCalled();
})
});
});
describe('userLoginCtrl', function() {
beforeEach(module('Betizy'));
beforeEach(inject(function (_$controller_, _$stateParams_, _ngToast_, _$filter_) {
$controller = _$controller_;
$stateParams = _$stateParams_;
ngToast = _ngToast_;
$filter = _$filter_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userLoginCtrl', {});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.login.message'));
});
it('add an danger toast in the toastList if user was mistaken during authentication.', function () {
$stateParams.state = "error";
var controller = $controller('userLoginCtrl', {});
expect(ngToast.messages.length).toBe(2);
expect(ngToast.messages[0].className).toBe('danger');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.login.error'));
});
});
});
describe('userRegisterCtrl', function(){
beforeEach(module('Betizy'));
var $controller;
beforeEach(inject(function(_$controller_, _userService_, _ngToast_, _$filter_, _navigationService_){
$controller = _$controller_;
userService = _userService_;
ngToast = _ngToast_;
$filter = _$filter_;
navigationService = _navigationService_;
}));
describe('at its launch', function () {
it('add an info toast in the toastList to say at the user what to do.', function () {
var controller = $controller('userRegisterCtrl', {
});
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('info');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.register.message'));
})
});
describe('for a valid registration', function () {
it("call method from userService when register is called by the click on register button.", function () {
var fakeHttpPromise = {
then: function () {}
};
var controller = $controller('userRegisterCtrl', {
});
controller.userRegisterForm = {$valid: true};
spyOn(userService, 'register').and.returnValue(fakeHttpPromise);
spyOn(navigationService, 'toIndex').and.returnValue(fakeHttpPromise);
controller.register();
expect(userService.register).toHaveBeenCalledTimes(1);
setTimeout(function () {
expect(navigationService.toIndex).toHaveBeenCalledTimes(1);
done();
})
})
});
describe('for an invalid registration with invalid mail adress', function () {
it("add a danger toast in the toastList for an incorrect mail adress pattern.", function () {
var controller = $controller('userRegisterCtrl', {
});
controller.userRegisterForm = {$error: {email: true}, $valid: false};
ngToast.dismiss();
controller.register();
expect(ngToast.messages.length).toBe(1);
expect(ngToast.messages[0].className).toBe('danger');
expect(ngToast.messages[0].content).toBe($filter('translate')('user.register.error.email.pattern'));
})
});
describe('for an invalid registration and a valid mail adress', function () {
it("does nothing.", function () {
var controller = $controller('userRegisterCtrl', {
});
var fakeHttpPromise = {
then: function () {}
};
controller.userRegisterForm = {$error: {email: false}, $valid: false};
spyOn(userService, 'register').and.returnValue(fakeHttpPromise);
ngToast.dismiss();
controller.register();
expect(ngToast.messages.length).toBe(0);
expect(userService.register).not.toHaveBeenCalled();
})
});
});
提前谢谢你的帮助我会发疯的
编辑:1
当我使用inspector在chrome中调试时,我看到:
单击激活按钮调用激活时,成功获取userService中有效注册调用方法的userActivateCtrl。
就在我看到之后: 未捕获错误::应为间谍,但已获取函数。 用法:expect().toHaveBeenCalledTimes() 在比较时(jasmine.js:3302)在期望时(jasmine.js:1543) 在activate.controller.js:41
所以问题是为什么它执行那个测试,而测试刚刚通过
感谢您的帮助:)哪些测试用例失败?正如您在两个屏幕上看到的,没有测试失败,但在我的浏览器的调试控制台中,它似乎在第二个测试中执行了两次activate.controller.js。哪些测试用例失败?正如您在两个屏幕上看到的,没有测试失败,但在我的浏览器的调试控制台中,它似乎在第二次测试中执行了两次activate.controller.js。