【问题标题】:AngularJS - How to test if a function is called from within another function?AngularJS - 如何测试一个函数是否从另一个函数中调用?
【发布时间】:2015-01-07 15:36:05
【问题描述】:

我正在尝试开始使用 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;
}

addNewfakeFunction 都使用:

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';

我只想知道如何测试一个公共函数是否被另一个函数调用。

【问题讨论】:

    标签: angularjs jasmine karma-runner karma-jasmine


    【解决方案1】:

    您的addNew 方法正在调用fakeFunction。但是,它没有调用controller.fakeFunction,这是您的期望。

    您需要更改代码以使用您的控制器,而不是这些独立的功能。

    编辑:您还需要不要监视您的 addNew 函数。这导致该功能被间谍替换。另一种选择是将其更改为:

    spyOn(controller, 'addNew').and.callThrough()
    

    【讨论】:

    • 我试过打电话给vm.fakeFunction,也不管用。具体是怎么做的?
    • @RaphaelRafatpanah 我不知道 vm 是什么,但这不是你要测试的,你是在测试 controller.fakeFunction 被调用
    • 抱歉没有澄清。 vm 是用于在 Angular 控制器中捕获 this 的常用变量。实际上,vmcontroller 都应该指代this
    • @RaphaelRafatpanah 也许您可以发布更多代码,例如,您的 controller 在测试设置中的变量如何?你的控制器是什么样子的?
    • vm 是 ViewModel 的简称。通常用作var vm = this;
    【解决方案2】:

    我自己也遇到了这个问题。 @Vadim 之前的回答有正确的原则,但我认为一切都不是很清楚。就我而言,我试图从另一个函数中调用服务的公共函数。以下是相关的sn-ps:

    服务:

    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();
    });

    这里的关键是被测试的函数需要调用与被监视的公共函数相同的引用。

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 2018-09-15
      • 2022-10-25
      • 2017-05-13
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多