我正在使用Karma在我的Angular 4应用程序上运行测试。它在本地工作,但当它在我的主机环境(Travis CI)上运行时,它失败并显示以下信息:
INFO [HeadlessChrome 0.0.0 (Ubuntu 0.0.0)]: Connected on socket vT0QnQaqRkn010dfsw with id 10189531
HeadlessChrome 0.0.0 (Ubuntu 0.0.0): Executed 0 of 180 SUCCESS (0 secs / 0 secs)
e 0.0.0 (Ubuntu 0.0.0): Executed 1 of 180 SUCCESS (0 secs / 0.714 secs)
HeadlessChrome 0.0.0 (Ubuntu 0.0.0) ERROR
Uncaught [object Object]
at http://localhost:9876/_karma_webpack_/vendor.bundle.js:14078
我尝试从"Uncaught [object Object]" when running karma tests on Angular遵循建议(删除NPM缓存等),但它没有解决我的问题。
如何识别导致此Uncaught [object Object]
错误的原因。我应该采取哪些额外步骤进行故障排除?
完全披露,我是贾斯汀解决这个问题的人。
问题是我们正在将模块导入我们的单元测试中。这些模块有一个组件,它具有发出HTTP请求的ngOnInit
。模块将实际组件注入测试,并尝试发出HTTP请求但失败。因为它超出了正常的堆栈,堆栈跟踪给了我们非常无益的错误Uncaught [object Object]
。
为了避免这个问题,并且组件不是未定义的,我们使用Christian Nunciato的有用的ng2-mock-component库来创建一个带有所有相同输入的模拟组件。
因为模拟组件有自己的单元测试,所以我们不关心父组件上的单元测试是否同时测试子组件。
这就是为我解决的问题:
我搜索了整个项目中所有HttpClientModule
文件中*.spec.ts
的出现。原来我有几个!
然后我替换了所有出现的
import { HttpClientModule } from '@angular/common/http';
同
import { HttpClientTestingModule } from '@angular/common/http/testing';
然后我确保我的每个测试的imports
的TestBed.configureTestingModule
数组中的条目从HttpClientModule
变为HttpClientTestingModule
。
最后我关闭了我的Wifi并再次运行测试。瞧:它很有效!
好吧还有另一种方法可以解决这个错误:
对我而言,我忘记打电话了
beforeEach(() => {
TestBed.configureTestingModule({
});
});
我的猜测是,如果没有调用它,它会从AppModule获取NgModule,从而尝试导入那里导致此问题的所有模块
在我的例子中,问题是组件测试,其子组件在其ngOnInit方法中进行http调用,没有导入HttpClientTestingModule。如果运行测试并在网络页面上打开devtools,则可以检查测试期间是否进行了http调用。导入模块后,在测试期间没有进行http调用。