0

我已经看到了该问题的一组重复项,但无法解决该问题。

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

如何在控制器初始化期间停止调用实际(控制器)fetchtemplate()?我的意图是在我的规范中模拟函数 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()给出错误的 spyOn 之前,因为当时fetchtemplate()不存在 spyOn。

我的控制器代码结构看起来像 -

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

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

我得到的结果是 - 首先是控制台项“控制器的功能”,然后是使用模拟功能执行规范。我希望模拟函数在没有控制器函数执行的情况下执行

4

1 回答 1

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


});

我希望这会有所帮助

于 2016-05-13T11:04:22.597 回答