AngularJS-如何测试一个函数是否从另一个函数中调用?
我正试着从karma jasmine开始,我想知道为什么这个测试失败了:AngularJS-如何测试一个函数是否从另一个函数中调用?,angularjs,jasmine,karma-runner,karma-jasmine,Angularjs,Jasmine,Karma Runner,Karma Jasmine,我正试着从karma jasmine开始,我想知道为什么这个测试失败了: it("should call fakeFunction", function() { spyOn(controller, 'addNew'); spyOn(controller, 'fakeFunction'); controller.addNew(); expect(controller.fakeFunction).toHaveBeenCalled(); }); 在我之前为此测试设置的
it("should call fakeFunction", function() {
spyOn(controller, 'addNew');
spyOn(controller, 'fakeFunction');
controller.addNew();
expect(controller.fakeFunction).toHaveBeenCalled();
});
在我之前为此测试设置的控制器中,我有以下内容:
function addNew() {
fakeFunction(3);
}
function fakeFunction(number) {
return number;
}
addNew
和fakeFunction
都通过以下方式公开:
vm.addNew = addNew;
vm.fakeFunction = fakeFunction;
但是,测试失败,原因如下:
function addNew() {
fakeFunction(3);
}
function fakeFunction(number) {
return number;
}
预期已调用spy fakeFunction。
如果我在测试中调用函数,我可以使测试通过。然而,我希望能够测试另一个函数是否调用了fakeFunction
。实现这一目标的正确方法是什么
更新:
//test.js
beforeEach(function() {
module("app");
inject(function(_$rootScope_, $controller) {
$scope = _$rootScope_.$new();
controller = $controller("CreateInvoiceController", {$scope: $scope});
});
});
如果我测试如下内容:
it('should say hello', function() {
expect(controller.message).toBe('Hello');
});
如果我将以下内容放入控制器中,则测试通过:
var vm = this;
vm.message = 'Hello';
我只想知道如何测试是否从另一个函数调用了公共函数。您的
addNew
方法正在调用fakeFunction
。但是,它并没有调用controller.fakeFunction
,这正是您所期望的
您需要更改代码以使用控制器,而不是这些独立的函数
编辑:您也不需要监视您的addNew
功能。这导致该功能被间谍替换。另一种选择是将其更改为:
spyOn(controller, 'addNew').and.callThrough()
我自己也遇到了这个问题。@Vadim之前的回答有正确的原则,但我不认为一切都很清楚。在我的例子中,我试图从另一个函数中调用服务的公共函数。以下是相关片段: 服务:
angular.module('myApp').factory('myService',function()){
函数doSomething(){
service.publicMethod();
}
函数publicMethod(){
//做事
}
var服务={
publicMethod:publicMethod
};
回程服务;
});
我尝试调用了vm.fakeFunction
,但它也不起作用。具体是怎么做的?@RaphaelRafatpanah我不知道什么是vm
,但这不是你要测试的,你在测试控制器。fakeFunction
因为没有澄清而被称为sorryvm
是在角度控制器中捕获此的常用变量。实际上,vm
和controller
都应该引用这个@RaphaelRafatpanah也许你可以发布更多的代码,例如,你的controller
变量在测试设置中如何?您的控制器看起来像什么?vm是ViewModel的简称。通常用作var vm=this代码>