我正在使用angularJs,我想在我的控制器中测试$ on事件,所以我尝试用这种方式编写测试用例:
beforeEach(inject(function ($controller,$injector) {
$rootScope = $injector.get('$rootScope');
$scope = $rootScope.$new();
controller = $controller('MyController', {
$scope: $scope
});
}));
spyOn($rootScope, '$broadcast').and.callThrough();
spyOn($rootScope, '$on').and.callThrough();
it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
controller = CreateTarget();
expect($rootScope.$broadcast).toHaveBeenCalled();
expect($rootScope.settings.layout.pageBodySolid).toBe(false);
});
但是我收到了这个错误:
错误:spyOn找不到要监视$ broadcast()
的对象
我也尝试以这种方式进行测试:
beforeEach(inject(function ( $controller,$injector) {
$rootScope = $injector.get('$rootScope');
$scope = $rootScope.$new();
controller = $controller('MyController', {
$scope: $scope
});
CreateTarget = function() {
$controller('MyController', {$scope: $scope});
}
}));
it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
controller = CreateTarget();
$rootScope.$broadcast('$viewContent');
expect($rootScope.settings.layout.pageBodySolid).toBe(false);
});
这次我收到此错误
TypeError:无法读取未定义
的属性'layout'
这是我的控制器事件
$scope.$on('$viewContent', function () {
$rootScope.settings.layout.pageBodySolid = false;
$rootScope.settings.layout.pageSidebarClosed = false;
});
我不知道怎么能这样做。这是我第一次使用angularJs测试我需要你的帮助。谢谢你。
答案 0 :(得分:1)
这里有一些问题:
首先是spyOn
。您传入控制器的$scope
实际上是一个新实例,但您正在监视$rootScope
对象,因此它们是两个完全不同的实例。
其次,您不一定要测试$broadcast
或$on
被调用,因为那时您实际上是在测试Angular。在这些情况下,您想要测试的是您自己的代码和事件广播的结果。
因此,在您的情况下,您要测试的是,当收到$ viewContent事件时,$rootScope
上的这两个属性应设置为false。
这让我想到了第三点:layout undefined
消息是因为您尝试在settings
的{{1}}属性上设置值,但您从未初始化任何事情。在您进行设置时,它是未定义的。
TL; DR,这就是你可以测试它的方法(注意:这段代码可能需要调整。我在内存中打字,而不是实际测试它是否有效。这只是为了给你一个想法)< / p>
$rootScope