Jasmine没有报告已调用Angular控制器函数

时间:2015-05-07 19:08:14

标签: angularjs unit-testing jasmine

我在控制器上定义了一个方法,我正在尝试测试它是否已被调用。我能够测试该方法是否被定义,但是当我尝试测试它是否被调用时,它会抱怨它希望调用间谍。

这是我的控制器:

myControllers.controller 'MyCtrl', ($scope) ->
  this.init = () -> doStuff()
  this.init()

这是我的测试套件:

describe "testing myCtrl", () ->
  beforeEach "myControllers"
  $controller = {}
  $scope = {}

  beforeEach inject (_$controller_,$rootScope) ->
    $controller = _$controller_
    $scope = $rootScope.$new()

  describe "MyCtrl", () ->
    beforeEach () -> 
      MyCtrl=$controller('MyCtrl',{$scope:$scope})

    it "should be defined", () -> # passes
      expect(MyCtrl).toBeDefined() 

    it "should define #init", () -> # passes
      expect(angular.isFunction(MyCtrl.init)).toBe true 

    it "should call #init", () -> # fails
      spyOn MyCtrl, 'init'
      expect(MyCtrl.init).toHaveBeenCalled()

最后一个断言导致错误:调用了预期的spy init。

2 个答案:

答案 0 :(得分:0)

这是因为它立即被调用,所以当你的测试命中时,它已经运行了。您创建MyCtrl的beforeEach是自动调用的地方。你必须采用不同的方式来构建测试。

答案 1 :(得分:0)

我相信问题的答案是我的控制器中没有init()函数。没有理由。控制器中的顶级代码在实例化时运行,将其包装在init函数中是多余的。