Jasmine Js - 在控制器初始化期间SpyOn Fakecall

时间:2016-05-13 10:13:59

标签: angularjs unit-testing jasmine karma-jasmine spyon

我已经看到了这个问题的一组重复但无法解决问题。

我有一个控制器,在控制器初始化期间,首先调用fetchtemplate(),然后调用我的mock fetchtemplate()。

如何在控制器初始化期间停止调用实际(控制器)fetchtemplate()?我的目的是在我的spec中模拟函数fetchtemplate()。请看看我的规范 -

describe("...",function(){
   beforeEach(inject(function($controller,...) {
   scope        =   $rootScope.$new();

   this.init = function() {
                  $controller('ChangeControlCreateController', {
                    $scope: scope
                  });
                }
    }));
    describe('Function', function() {

        it("-- check for trueness",function(){

        this.init()     ; //Initialization of the controller
        spyOn(scope,'fetchtemplate').and.callFake(function() {
                  return 101;
                });
        var fakeResponse = scope.fetchtemplate();
        expect(scope.fetchtemplate).toHaveBeenCalled();
        expect(fakeResponse).toEqual(101);      
        });


    });
});

我已经尝试将spyOn放在this.init()之前,因为fetchtemplate()当时不存在错误而导致错误。

我的控制器代码结构如下 -

angular.module('...', [...])

  .controller('ChangeControlCreateController', ["$scope"...,
    function ChangeControlCreateController($scope,...) {
        $scope.fetchtemplate = function() {
            console.log("controller's function");            
            ...
        };
        $scope.fetchtemplate();
    });

我得到的结果是 - 首先是控制台项目"控制器的功能"然后使用mock函数执行规范。我希望mock函数执行而不用执行控制器的函数

1 个答案:

答案 0 :(得分:1)

因此,如果我理解正确,您正在调用一个函数,该函数正在执行您希望阻止测试的功能。可能是一个http电话或某种东西?

无论它做什么,处理类似事情的正确方法通常是将该方法放入服务中,然后监视该服务方法。以下是测试服务是否为TemplateService的示例:

describe("...",function(){

var $controller, scope, TemplateService, YourController;

beforeEach(inject(function(_$controller_, _TemplateService_, ...) {
  scope = $rootScope.$new();
  $controller = _$controller_;
  TemplateService = _TemplateService_;  
}

it("-- check for trueness",function(){

  spyOn(TemplateService,'fetchTemplate').and.returnValue('101');

YourController = $controller('YourController'); 
  expect(...);
});


});

我希望这很有用