2017-05-31 50 views
0

我試圖運行一個簡單的單元測試,只是創建一個控制器(一個同事寫了它,所以其他人可以添加他們的自己的單元測試),但是我所做的改變都阻止了這種傳遞。同事不知道爲什麼它不起作用。這是簡單的測試。

測試

describe("My Controller", function() { 
    var $q, $controller, $scope, $rootScope; 
    var createCtrl; 
    beforeEach(function() { 
     module('myModule'); 
    }); 
    beforeEach(inject(function (_$q_, _$rootScope_, _$controller_, _$httpBackend_) { 
     $controller = _$controller_; 
     $scope = _$rootScope_.$new(); 
     $scope.$parent = { 
      dummyFn: function() {} 
     }; 
     createCtrl = function createCtrl() { 
      return $controller('MyController', { 
       '$q': _$q_, 
       '$scope': $scope 
      }); 
     }; 
    })); 
})); 
describe("Controller stability", function() { 
    it("should initialise the controller without error", function() { 
     var controller = createCtrl(); 
    }); 
}); 

正如你可以看到上面的測試中創造了控制器沒有做任何事情,但catch錯誤的。

這是一個模擬了在控制器代碼:

代碼

(function() { 
    "use strict"; 
    const {angular} = window; 
    angular.module('myModule', []) 
    .controller('MyController', MyController); 
    MyController.$inject = ['$routeParams', '$scope']; 
    function MyController($routeParams, $scope) { 
     var vm = this; 
     $scope.$on('event-name', function(event, eventData) { 
      vm.eventData = eventData; 
      updateData(); 
     }) 
    } 
})(); 

錯誤的,我得到取決於我如何運行的因果報應,但鬆散的聯繫似乎。

如果我運行它形成了gulp任務的命令行,我得到的是:

TypeError: undefined is not an object (evaluating 'current.$$listenerCount[name]') in dist/app/vendor.js 
[email protected]/app/vendor<line number> 

並通過角堆棧跟蹤和回測試。

如果我在噶的調試窗口中運行它:

Uncaught TypeError: Cannot read property 'event-name' of undefined 
at Scope.$get.Scope.$on (hostname.com:9876/base/dist/vendor.js:<line number>) 

然後再次下跌,雖然堆棧跟蹤。

看看$on的代碼我看不出爲什麼它會以這兩種不同的方式失敗。

將控制器代碼更改爲使用$rootScope.$on似乎可以減輕測試的負擔,但我不明白爲什麼測試需要測試,而不是主應用程序。

爲什麼$on在測試中不在$scope上,當它在主應用程序中?

+0

這現在造成了必須清理聽衆的問題! – Pureferret

回答

0

問題來自$on關心$parent這一事實。

它會檢查父級,然後嘗試查看是否存在另一個偵聽器,但是由於未正確創建父級,所以無法找到它並死亡。

$scope.$parent = angular.extend(_$rootScope_.$new(), { 
     dummyFn: function() {} 
}); 

這樣,它將有所有屬性angularjs希望它有,當$on叫做:

相反,用實例化。

相關問題