我找不到任何其他满足我需求的问题/答案,所以这里是:
在 AngularJS (1.2.14) 控制器中,我有一个事件侦听器,它在听到事件 ('fetchData') 时执行 ajax 调用以获取一些数据。获取成功后,将广播一个事件(称为“fetchSuccess”),一个指令正在侦听(尽管该部分无关紧要)。
$scope.$on('fetchData', function () {
$scope
.submitSearch()
.then(function (results) {
$scope.$broadcast('fetchSuccess');
}, function () {
$scope.$broadcast('fetchError');
});
});
所以,在我的测试中,我想做这样的事情(假设'this.scope'是测试套件中控制器上的一个新 $scope 对象):
it('should broadcast "fetchSuccess"', inject(function ($rootScope) {
var scope = this.scope,
spy = chai.spy(scope, '$broadcast');
// trigger the $broadcast event that calls the fetch method
scope.$broadcast('fetchData');
$rootScope.$apply();
expect(scope.$broadcast).to.be.called.with('fetchSuccess');
}));
但我不清楚如何在断言中监听 $broadcast 事件。我不断收到此错误:AssertionError: expected function (name, args) {...}
需要明确的是,我的问题不在于事件广播器或运行时侦听器的功能;该应用程序按预期工作。问题在于监听测试套件中的事件。
请注意,上面的代码只是此问题所需的必要片段。在我的应用程序中,还有其他变量/方法可以设置/调用,并且这些东西可以正确测试。这意味着,如果我测试是否调用了实际的获取方法,或者是否正确设置了特定变量,则这些测试通过。
我尝试混合和匹配范围变量,甚至通过收听 $broadcast ,scope.$on('fetchSuccess', fn)
但似乎没有任何效果。fetchSuccess事件似乎没有发出,或者我没有正确监听它。
在此先感谢,瑞安。