Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS-如何测试一个函数是否从另一个函数中调用?_Angularjs_Jasmine_Karma Runner_Karma Jasmine - Fatal编程技术网

AngularJS-如何测试一个函数是否从另一个函数中调用?

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(); }); 在我之前为此测试设置的

我正试着从karma jasmine开始,我想知道为什么这个测试失败了:

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
因为没有澄清而被称为sorry
vm
是在角度控制器中捕获此
的常用变量。实际上,
vm
controller
都应该引用
这个
@RaphaelRafatpanah也许你可以发布更多的代码,例如,你的
controller
变量在测试设置中如何?您的控制器看起来像什么?vm是ViewModel的简称。通常用作
var vm=this