如何在我的Karma/Jasmine测试中调试"[object ErrorEvent] thrown"错误?

Dar*_*don 104 karma-jasmine angular-cli angular

我有几个失败的测试只输出[object ErrorEvent] thrown.我在控制台中看不到任何可以帮助我查明违规代码的内容.我需要做些什么来追踪这些?

[编辑]:我正在运行Karma v1.70,Jasmine v2.7.0

Kun*_*vič 117

要解决此问题,您必须在没有源映射的情况下运行测试作为解决方法:

CLI v6.0.8及更高版本
--source-map=false

CLI v6.0.x早期版本
--sourceMap=false

CLI v1.x.
--sourcemaps=false

快捷方式ng test -sm=false也可行

https://github.com/angular/angular-cli/issues/7296上有一个未解决的问题

更新:我也有这个问题,所以我只是迁移到最新的cli,并确保所有包都更新,package.json我也完全重新安装,node_modules所以现在问题已经消失.

  • 对于angular-cli 6,`--sourceMap = false`似乎有效. (10认同)
  • 我在随机组件中抛出了 Uncaught [object Object],并且在某些运行中我什么也没得到......:SI 讨厌 Angular 测试。 (4认同)
  • 这对我有用.它有助于揭示问题是未定义的输入绑定. (3认同)
  • 这个解决方案不再起作用了。以前有,但在 6.2.4 中没有 (2认同)

Vic*_*hin 47

如果sourcemap = false没有帮助,请尝试1)打开运行测试的浏览器2)单击调试按钮3)打开控制台

错误将在那里

在此输入图像描述

  • 我甚至不需要单击调试按钮.刚刚打开开发者控制台为我工作. (8认同)

har*_*rci 22

尝试通过从终端运行测试来获得更具描述性的错误消息,如下所示:

ng test -sm=false
Run Code Online (Sandbox Code Playgroud)

在您的测试中,您可以替换

it('should...')
Run Code Online (Sandbox Code Playgroud)

fit('should...') 
Run Code Online (Sandbox Code Playgroud)

现在只有fit之前的测试才会运行.要在运行测试后让浏览器保持打开状态,请运行以下测试:

ng test -sm=false --single-run false
Run Code Online (Sandbox Code Playgroud)

就个人而言,我遇到过两次这个错误.两者都只在调用fixture.detectChanges()时触发.

第一时间,我在我的.html文件使用字符串插值更安全地解决了这个问题.

不安全的例子:

<p>{{user.firstName}}</p>
Run Code Online (Sandbox Code Playgroud)

安全(r)示例(注意问号):

<p>{{user?.firstName}}</p>
Run Code Online (Sandbox Code Playgroud)

同样适用于财产绑定:

<p [innerText]="user?.firstName"></p>
Run Code Online (Sandbox Code Playgroud)

第二次的时候,我使用的是DatePipe在我的.html文件,但我用它在模拟财产不是一个日期.

.html文件:

<p>{{startDate | date: 'dd-MM-yyyy'}}</p>
Run Code Online (Sandbox Code Playgroud)

.ts(模拟数据)文件(错误):

let startDate = 'blablah';
Run Code Online (Sandbox Code Playgroud)

.ts(模拟数据)文件(正确):

let startDate = '2018-01-26';
Run Code Online (Sandbox Code Playgroud)

  • @DylanKapp在尝试读取对象的属性之前检查对象是否为null.有关详细信息,请参阅https://angular.io/guide/template-syntax#safe-navigation-operator. (2认同)

小智 16

这是因为jasmine框架无法处理ErrorEvent类型,因此它不会提取错误消息并调用error.toString()该对象.

我刚刚在jasmine repo上提交了一个问题 https://github.com/jasmine/jasmine/issues/1594

只要不修复,您就可以在node_modules文件夹中临时修补已安装的jasmine软件包.就我而言

node_modules/jasmine/node_modules/lib/jasmine-core/jasmine.js

然后从中更改ExceptionFormatter的实现

if (error.name && error.message) {
    message += error.name + ': ' + error.message;
} else {
    message += error.toString() + ' thrown';
}
Run Code Online (Sandbox Code Playgroud)

对此

if (error.name && error.message) {
    message += error.name + ': ' + error.message;
} else if (error.message) {
    message += error.message;
} else {
    message += error.toString() + ' thrown';
}
Run Code Online (Sandbox Code Playgroud)

它有助于确定问题.

  • 这对我有用jasmine-core@2.99.1。但是,我必须在`node_modules / jasmine_core / lib / jasmine_core / jasmine.js`中打补丁。 (2认同)

roo*_*oo2 7

对我来说,这与在ngOnInit一个组件中解决了一个承诺有关.我不得不使用async,fakeAsync并勾选和删除异步服务spyOn

beforeEach(async(
  //... initialise testbed and component
))
beforeEach(fakeAsync(
  // ... setup mocks then call:
  component.ngOnInit()
  tick()
  fixture.detectChanges()
))
Run Code Online (Sandbox Code Playgroud)

Angular - 如何使用异步服务调用对测试组件进行单元化