测试 - 间歇性错误:'失败:选择器“#root0”不匹配任何元素'

Posted

技术标签:

【中文标题】测试 - 间歇性错误:\'失败:选择器“#root0”不匹配任何元素\'【英文标题】:Testing - Intermittent error: 'Failed: The selector "#root0" did not match any elements'测试 - 间歇性错误:'失败:选择器“#root0”不匹配任何元素' 【发布时间】:2016-04-19 19:19:57 【问题描述】:

我正在 Angular2 测试版上构建一个应用程序,当我运行我的测试用例时,我随机收到错误:

选择器“#root0”不匹配任何元素的错误。

测试代码:

@Component(
  template: '',
  directives: [GroupBox, GroupBoxHeader]
)
class TestComponent 


describe('group-box control', () => 

  it('should show the title', injectAsync([TestComponentBuilder], (tcb) => 
    return tcb.overrideTemplate(TestComponent, '<group-box><group-box-header>Title Content</group-box-header></group-box>')
      .createAsync(TestComponent).then( (fixture) => 
        fixture.detectChanges();
        let compiled = fixture.debugElement.nativeElement;
        expect(compiled).toContainText('Title Content');
    );
  ));

  it('should show the body', injectAsync([TestComponentBuilder], (tcb) => 
    return tcb.overrideTemplate(TestComponent, '<group-box><group-box-header>Title Content</group-box-header>Body Content</group-box>')
      .createAsync(TestComponent).then( (fixture) => 
        fixture.detectChanges();
        let compiled = fixture.debugElement.nativeElement;
        expect(compiled).toContainText('Body Content');
    );
  ));
);

我正在使用 Karma 和 Jasmine,遵循 https://github.com/juliemr/ng2-test-seed 的指导方针

以下存储库重现错误:https://github.com/cangosta/ng2_testing_controls

堆栈跟踪:

14 01 2016 11:40:32.073:INFO [karma]:Karma v0.13.19 服务器开始于 http://localhost:9876/ 14 01 2016 11:40:32.078:INFO [启动器]:启动浏览器 Chrome 14 01 2016 11:40:32.669:INFO [Chrome 47.0.2526 (Windows 8.1 0.0.0)]: 连接到套接字 /#9hKZqsNbKFPfYWzIAAAA 与 id 50428936 Chrome 47.0.2526 (Windows 8.1 0.0.0) 组框控件应显示正文 FAILED 失败:选择器“#root0”不匹配任何元素 错误:选择器“#root0”不匹配任何元素 在新的 BaseException (C:/Projectos/Fontes/Stratus-html/build/assets/js/angular2.dev.js:8080:21) 在 DomRenderer_.createRootHostView (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2.dev.js:15248:15) 在 AppViewManager_.createRootHostView (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2.dev.js:11265:52) 在 C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2.dev.js:14531:46 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:138:17) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2544:30) 在 zoneBoundFn (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:111:19) 在 lib$es6$promise$$internal$$tryCatch (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1511:16) 在 lib$es6$promise$$internal$$invokeCallback (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1523:17) 在 lib$es6$promise$$internal$$publish (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1494:11) 在 C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:243:5 在微任务 (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2557:15) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:138:17) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2544:30) 在 zoneBoundFn (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:111:19) 在 lib$es6$promise$asap$$flush (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1305:9) 失败:无法读取未定义的属性“hostView” TypeError:无法读取未定义的属性“hostView” 在新的 ComponentFixture_ (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2047:97) 在 C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2145:16 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:138:17) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2544:30) 在 zoneBoundFn (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:111:19) 在 lib$es6$promise$$internal$$tryCatch (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1511:16) 在 lib$es6$promise$$internal$$invokeCallback (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1523:17) 在 lib$es6$promise$$internal$$publish (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1494:11) 在 C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:243:5 在微任务 (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2557:15) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:138:17) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2544:30) 在 zoneBoundFn (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:111:19) 在 lib$es6$promise$asap$$flush (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1305:9) 失败:无法读取未定义的属性“detectChanges” TypeError:无法读取未定义的属性“detectChanges” 在 C:/Projectos/Fontes/Stratus-HTML/build/test/infrastructure/controls/group-box.test.js:52:20 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:138:17) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2544:30) 在 zoneBoundFn (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:111:19) 在 lib$es6$promise$$internal$$tryCatch (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1511:16) 在 lib$es6$promise$$internal$$invokeCallback (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1523:17) 在 lib$es6$promise$$internal$$publish (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1494:11) 在 C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:243:5 在微任务 (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2557:15) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:138:17) 在 Zone.run (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/testing.dev.js:2544:30) 在 zoneBoundFn (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:111:19) 在 lib$es6$promise$asap$$flush (C:/Projectos/Fontes/Stratus-HTML/build/assets/js/angular2-polyfills.js:1305:9) Chrome 47.0.2526(Windows 8.1 0.0.0):执行 59 次,共 60 次(1 次失败)(跳过 1 次)(0.519 秒 / 0.51 秒) [11:40:33]“测试”在 2.01 秒后出错 [11:40:33] 错误:1 在 formatError (C:\Users\LSANTOS\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:169:10) 在 Gulp。 (C:\Users\LSANTOS\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:195:15) 在 emitOne (events.js:77:13) 在 Gulp.emit (events.js:169:7) 在 Gulp.Orchestrator._emitTaskDone (C:\Projectos\Fontes\Stratus-HTML\node_modules\orchestrator\index.js:264:8) 在 C:\Projectos\Fontes\Stratus-HTML\node_modules\orchestrator\index.js:275:23 完成时(C:\Projectos\Fontes\Stratus-HTML\node_modules\orchestrator\lib\runTask.js:21:8) 在 cb (C:\Projectos\Fontes\Stratus-HTML\node_modules\orchestrator\lib\runTask.js:29:3) 在 removeAllListeners (C:\Projectos\Fontes\Stratus-HTML\node_modules\karma\lib\server.js:333:7) 在服务器。 (C:\Projectos\Fontes\Stratus-HTML\node_modules\karma\lib\server.js:344:9) 在 Server.g (events.js:260:16) 在 emitNone (events.js:72:20) 在 Server.emit (events.js:166:7) 在 emitCloseNT (net.js:1518:8) 在 doNTCallback1 (node.js:418:9) 在 process._tickCallback (node.js:340:17)

【问题讨论】:

我会试试的。我没有使用 TS,我使用的是 ES6+Traceur。我创建了一个仓库,您可以在其中轻松重现错误:github.com/cangosta/ng2_testing_controls Gunter,我已经用简化版更新了存储库 有一个 bug with TestComponentBuilder 和 templateUrl。临时解决方法是使用 .overrideTemplate(TestComponent, ),因为你正在做。但是,您正在覆盖 TestComponent 而不是 GroupBox 组件,它也有templateUrl: './group-box.html'...我相信这是导致错误的原因,但不幸的是我不知道如何解决它 - 我只测试了孤立的组件... Sasxa,从 group-box 组件中删除 templateUrl 确实解决了这个问题,但这不是一个解决方案,因为我的整个应用程序都有巨大的组件模板。在我看来,我将不得不等待 Angular 团队修复此错误... Angular2 - testing component with two "it" creates 'selector "#root0" did not match any elements error'的可能重复 【参考方案1】:

这已在 Angular 2.0.0-beta.3 中修复

详情请见https://github.com/angular/angular/issues/6483#issuecomment-179557485

基本上,我必须做的:

使用 tsd install jasmine -so 手动为 jasmine 添加类型,并在测试文件中添加 ///&lt;reference...; 在我的导入中添加这个:
import setBaseTestProviders from 'angular2/testing';

import 
  TEST_BROWSER_PLATFORM_PROVIDERS,
  TEST_BROWSER_APPLICATION_PROVIDERS
 from 'angular2/platform/testing/browser';

在我的组件测试之前添加这个:

  setBaseTestProviders(TEST_BROWSER_PLATFORM_PROVIDERS, TEST_BROWSER_APPLICATION_PROVIDERS);

【讨论】:

以上是关于测试 - 间歇性错误:'失败:选择器“#root0”不匹配任何元素'的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 错误 - 请求失败,响应为空

Apple 的 CI Bots 的 KIF iOS 测试失败

如何为嵌入式 mongo (flapdoodle) 全局设置 WriteConcern 以修复间歇性测试失败

设置选定值后,引导选择选择器刷新间歇性工作

在 Elasticsearch NEST 中的索引间歇性失败后立即调用 Search

ios UITest中的间歇性“尝试启动失败”