在$promise中使用$broadcast, mocha如何知道事件何时在控制器$scope中触发?

How can mocha know when event fired on a Controller $scope using $broadcast inside of a $promise?

本文关键字:控制器 何时 scope 事件 mocha promise broadcast 何知道      更新时间:2023-09-26

我找不到满足我需求的其他问题/答案,所以这里是:

在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:期望函数(name, args){…}

只是为了清楚,我的问题不是事件广播器或监听器在运行时的功能;应用程序按预期工作。问题在于监听测试套件中的事件。

注意,上面的代码只是这个问题所需要的代码片段。在我的应用程序中,还有其他变量/方法被设置/调用,这些东西被正确地测试出来。这意味着如果我测试是否调用了实际的抓取方法,或者是否适当地设置了一个特定的变量,这些测试就会通过。

我试过混合和匹配范围变量,甚至通过scope.$on('fetchSuccess', fn)收听$广播,但似乎没有任何作用。fetchSuccess事件似乎没有被发出,或者我没有正确地侦听它。

提前感谢,瑞安。

所以,我找到了我问题的答案,这都是我的错。虽然我不得不修改编写测试的方式,但核心问题就像监听错误事件一样简单!

但是,对于那些想知道我的测试是什么样子的人,这里是最后的测试(rootscope在其他地方被设置为$ rootscope):

it('should broadcast a "fetchSuccess" event', function (done) {
    var eventEmitted = false;
    this.scope.$on('fetchSuccess', function () {
            eventEmitted = true;
            done();
        });
        this.scope.$broadcast('fetchData');
    rootscope.$apply();
    eventEmitted.should.be.true;
});

没有必要监视$broadcast事件,AngularJS的$on监听器就足够了。