AngularJS - 如何测试一个函数是否被另一个函数调用?
AngularJS - How to test if a function is called from within another function?
我正在尝试开始使用 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;
但是,测试失败并显示以下内容:
Expected spy fakeFunction to have been called.
如果我从我的测试中调用该函数,我可以使测试通过。然而,我希望我可以测试 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';
我只想知道如何测试 public 函数是否被另一个函数调用。
您的 addNew
方法正在调用 fakeFunction
。但是,它没有调用 controller.fakeFunction
,这是您的期望。
您需要更改代码才能使用您的控制器,而不是这些独立的函数。
编辑:您还需要不要监视您的 addNew
函数。这导致函数被间谍替换。另一种选择是将其更改为:
spyOn(controller, 'addNew').and.callThrough()
我自己刚遇到这个问题。 @Vadim 之前的回答有正确的原则,但我认为一切都不是很清楚。就我而言,我试图从另一个函数中调用服务上的 public 函数。以下是相关片段:
服务:
angular.module('myApp').factory('myService', function() {
function doSomething() {
service.publicMethod();
}
function publicMethod(){
// Do stuff
}
var service = {
publicMethod: publicMethod
};
return service;
});
测试:
it('calls the public method when doing something', function(){
spyOn(service, 'publicMethod');
// Run stuff to trigger doSomething()
expect(service.publicMethod).toHaveBeenCalled();
});
这里的关键是被测试的函数需要调用与被监视的 public 函数相同的引用。
我正在尝试开始使用 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;
但是,测试失败并显示以下内容:
Expected spy fakeFunction to have been called.
如果我从我的测试中调用该函数,我可以使测试通过。然而,我希望我可以测试 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';
我只想知道如何测试 public 函数是否被另一个函数调用。
您的 addNew
方法正在调用 fakeFunction
。但是,它没有调用 controller.fakeFunction
,这是您的期望。
您需要更改代码才能使用您的控制器,而不是这些独立的函数。
编辑:您还需要不要监视您的 addNew
函数。这导致函数被间谍替换。另一种选择是将其更改为:
spyOn(controller, 'addNew').and.callThrough()
我自己刚遇到这个问题。 @Vadim 之前的回答有正确的原则,但我认为一切都不是很清楚。就我而言,我试图从另一个函数中调用服务上的 public 函数。以下是相关片段:
服务:
angular.module('myApp').factory('myService', function() {
function doSomething() {
service.publicMethod();
}
function publicMethod(){
// Do stuff
}
var service = {
publicMethod: publicMethod
};
return service;
});
测试:
it('calls the public method when doing something', function(){
spyOn(service, 'publicMethod');
// Run stuff to trigger doSomething()
expect(service.publicMethod).toHaveBeenCalled();
});
这里的关键是被测试的函数需要调用与被监视的 public 函数相同的引用。