Javascript 因果报应、茉莉花、未可知的错误:<;已被催缴的时间>;:应为间谍,但未经测试就获得了功能

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

先为我的英语不好道歉

我正在用Karma和Jasmine测试我的应用程序,我有一个非常奇怪的错误

我有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。