离子单元测试中广播的意外 $locationChangeStart 和 $locationChangeSuccess 事件

Posted

技术标签:

【中文标题】离子单元测试中广播的意外 $locationChangeStart 和 $locationChangeSuccess 事件【英文标题】:Unexpected $locationChangeStart and $locationChangeSuccess events broadcasted in ionic unit tests 【发布时间】:2017-01-02 16:42:49 【问题描述】:

我正在为 ionic 应用程序实施单元测试,并且需要检查 $rootScope 上没有广播任何事件

expect($rootScope.$broadcast).not.toHaveBeenCalled();

问题是有时会广播 $locationChangeStart 和 $locationChangeSuccess 事件,这使我的测试失败。似乎 ionic v1.3.0 触发了以下代码中的那些

// update browser
$rootScope.$watch(function $locationWatch() 
  var oldUrl = trimEmptyHash($browser.url());
  var newUrl = trimEmptyHash($location.absUrl());
  var oldState = $browser.state();
  var currentReplace = $location.$$replace;
  var urlOrStateChanged = oldUrl !== newUrl ||
    ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);

  if (initializing || urlOrStateChanged) 
    initializing = false;

    $rootScope.$evalAsync(function() 
      var newUrl = $location.absUrl();
      var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
          $location.$$state, oldState).defaultPrevented;

上述代码中的“初始化”标志为真,这会触发 $rootScope.$broadcast。 问题 - 为什么会这样?处理这种情况的最佳方法是什么? 现在我添加了 $rootScope.$digest();在执行我的测试之前似乎可以解决问题但是我不确定这是否是有效的解决方案

谢谢

【问题讨论】:

【参考方案1】:

这可能更像是一个评论而不是一个答案,但我没有足够的声誉来写评论。

$locationChangeStart 和 $locationChangeSuccess 不是在其他所有操作之前被触发吗?甚至在 $rootScope 之前?据我了解,$locationChangeStart 的优先级高于 $rootScope。

你在 app.on(function () ); 中有什么东西吗? ?

【讨论】:

以上是关于离子单元测试中广播的意外 $locationChangeStart 和 $locationChangeSuccess 事件的主要内容,如果未能解决你的问题,请参考以下文章

Android中广播的发送BroadcastReceiver

错误处理“启动”:离子实时重载服务器意外退出

带有核心数据/MagicalRecord 意外行为的 iOS 单元测试

Vue/Typescript/Jest - Jest 单元测试语法错误:意外的令牌导入

角度单元测试:失败:模块“DynamicTestModule”导入的意外值“DxTemplateHost”:添加@NgModule 注释

离子构建失败“在 <manifest> 中发现了意外的元素 <provider>”