Làm cách nào để gỡ lỗi "[object ErrorEvent] được ném ra" trong các bài kiểm tra Karma / Jasmine của tôi?


108

Tôi có một số bài kiểm tra thất bại mà chỉ xuất ra [object ErrorEvent] thrown. Tôi không thấy bất kỳ thứ gì trong bảng điều khiển giúp tôi xác định mã vi phạm. Có điều gì tôi cần làm để theo dõi những thứ này không?

[EDIT]: Tôi đang chạy Karma v1.70, Jasmine v2.7.0


Bạn có thể bao gồm nhiều lỗi hơn không? Giống như nhiều dòng của lỗi trước và sau?
Kevin

2
[object ErrorEvent] thrownnghĩa đen là tất cả những gì nó nói. Không có gì trước hay sau.
Darrell Brogdon

1
Thật may mắn, tôi vừa gặp phải vấn đề này đúng vào lúc bạn đăng câu hỏi này, hóa ra nó là một thẻ script "giả mạo" (nó cũng có thể là liên kết css) cần được xóa (vấn đề của tôi có liên quan cho CORS), hoặc trong trường hợp css, tôi chỉ thêm crossorigin = "nặc danh". Kiểm tra mã của bạn để tìm các thẻ script / css như vậy, trong trường hợp của tôi, tôi nhận thấy sự cố do một thành phần hoàn toàn khác gây ra!
TheDude

bạn đang ở trên cli góc phải không? @DarrellBrogdon
kuncevic.dev

1
@TheDude Bạn đã thu hẹp tập lệnh này như thế nào? Từng dòng? Hoặc có một số quy trình gỡ lỗi đã giúp bạn thu hẹp vị trí của nó? Tôi đang gặp vấn đề tương tự và thông tin duy nhất tôi phải tiếp tục là thông báo: Đã xảy ra lỗi sau Tất cả. Nếu tôi tự cô lập thử nghiệm bằng cách thay đổi it()thành fit(), mặc dù chỉ có thử nghiệm duy nhất đó đang chạy, lỗi vẫn được đưa ra. Bất kỳ đề xuất gỡ lỗi nào cho loại lỗi này?
Knight

Câu trả lời:


121

FYI: bạn có thể tìm thấy lỗi chính xác chỉ bằng cách mở Bảng điều khiển DevTools khi các thử nghiệm của bạn đang chạy.

Là một bản sửa lỗi nhanh, bạn có thể thử chạy các thử nghiệm của mình mà không cần sơ đồ nguồn :

CLI v6.0.8 trở lên
--source-map=false

Phiên bản đầu tiên CLI v6.0.x
--sourceMap=false

CLI v1.x
--sourcemaps=false

Phím tắt ng test -sm=falsecũng có thể hoạt động

Có một vấn đề mở trên https://github.com/angular/angular-cli/issues/7296

CẬP NHẬT : Tôi cũng gặp sự cố đó, vì vậy tôi vừa chuyển sang cli mới nhất và đảm bảo rằng tất cả các gói được cập nhật package.jsoncũng như tôi đã cài đặt lại đầy đủ node_modulesnên hiện tại vấn đề đã biến mất.


3
điều này đã làm việc cho tôi. Nó giúp tiết lộ rằng vấn đề là với một ràng buộc đầu vào không xác định.
JP Lew

10
Đối với angle-cli 6, --sourceMap=falsedường như hoạt động.
skermajo

1
giải pháp phía trước điển hình
Mcsky

1
Giải pháp này không hoạt động nữa. Nó đã từng, nhưng trong 6.2.4 thì không
Mike

3
Tôi nhận được Uncaught [object Object] ném vào các thành phần ngẫu nhiên và trong một số lần chạy, tôi không nhận được gì ...: SI ghét Angular Testing.
Gerardo Buenrostro González

51

Nếu sourcemap = false không giúp được gì, hãy thử 1) mở trình duyệt của bạn đang chạy thử nghiệm 2) nhấp vào nút gỡ lỗi 3) mở bảng điều khiển

Lỗi sẽ có

nhập mô tả hình ảnh ở đây


8
Tôi thậm chí không cần phải nhấp vào nút gỡ lỗi. Tôi chỉ cần mở bảng điều khiển dành cho nhà phát triển.
chris31389

Xuất sắc! Tôi đã thêm tùy chọn sơ đồ nguồn ở khắp mọi nơi, nhưng cuối cùng điều này đã cung cấp cho tôi thông tin tôi cần
SkarXa 27/09/18

1
--sourcemaps=falsekhông hiệu quả với tôi, nhưng nó hoạt động hoàn hảo! Cảm ơn bạn!
mrClean

Không thực sự hữu ích nếu trình duyệt đóng ngay sau khi kiểm tra. Đoán rằng tôi sẽ viết một loạt các bài kiểm tra vô ích để giữ cho cửa sổ mở, giống như một số loại thượng cổ.
CoryCoolguy

24

Hãy thử nếu bạn nhận được thông báo lỗi mô tả nhiều hơn bằng cách chạy kiểm tra từ thiết bị đầu cuối, như sau:

ng test -sm=false

Trong thử nghiệm của bạn, bạn có thể thay thế

it('should...')

với

fit('should...') 

Bây giờ chỉ có các bài kiểm tra trước sự phù hợp mới chạy. Để để trình duyệt mở sau khi chạy thử nghiệm, hãy chạy thử nghiệm như sau:

ng test -sm=false --single-run false

Cá nhân tôi đã gặp lỗi này hai lần. Cả hai chỉ được kích hoạt khi gọi fixture.detectChanges ().

Lần đầu tiên , tôi đã giải quyết nó bằng cách sử dụng nội suy chuỗi an toàn hơn trong tệp .html của tôi.

Ví dụ không an toàn :

<p>{{user.firstName}}</p>

Ví dụ Safe (r) (lưu ý dấu chấm hỏi):

<p>{{user?.firstName}}</p>

Điều tương tự cũng có thể áp dụng cho ràng buộc tài sản:

<p [innerText]="user?.firstName"></p>

Lần thứ hai , tôi đang sử dụng DatePipe trong tệp .html của mình, nhưng thuộc tính giả mà tôi sử dụng nó không phải là ngày tháng.

.html tệp:

<p>{{startDate | date: 'dd-MM-yyyy'}}</p>

Tệp .ts (mock-data) ( sai ):

let startDate = 'blablah';

Tệp .ts (mock-data) ( đúng ):

let startDate = '2018-01-26';

Bất kỳ nhận xét tại sao '?' giải thích chuỗi là an toàn hơn? Điều này làm việc trong kịch bản của tôi.
Dylan Kapp

2
@DylanKapp điều này sẽ kiểm tra xem đối tượng có rỗng không trước khi cố gắng đọc thuộc tính của đối tượng. Xem angle.io/guide/template-syntax#safe-navigation-operator để biết thêm chi tiết.
Christian Rondeau

18

Điều này là do khung công tác jasmine không thể xử lý kiểu ErrorEvent vì vậy nó không trích xuất thông báo lỗi và các cuộc gọi error.toString()trên đối tượng đó.

Tôi vừa gửi một vấn đề tại jasmine repo https://github.com/jasmine/jasmine/issues/1594

Miễn là nó chưa được sửa, bạn có thể tạm thời vá gói jasmine đã cài đặt của mình trong thư mục node_modules. Trong trường hợp của tôi, nó là

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

và sau đó thay đổi việc triển khai ExceptionFormatter từ điều này

if (error.name && error.message) {
    message += error.name + ': ' + error.message;
} else {
    message += error.toString() + ' thrown';
}

cái này

if (error.name && error.message) {
    message += error.name + ': ' + error.message;
} else if (error.message) {
    message += error.message;
} else {
    message += error.toString() + ' thrown';
}

Nó giúp xác định vấn đề.


3
Điều này đã làm việc cho tôi trong jasmine-core@2.99.1. Tuy nhiên, tôi đã phải vá nó trong node_modules/jasmine_core/lib/jasmine_core/jasmine.js
Roger Garza

Thật tốt - mất một phút để tìm bài đăng này nhưng nó đã cứu mông tôi. Cảm ơn. Cùng hoa nhài-core phiên bản
mr rogers

Sau khi thay đổi điều này, nó chỉ in uncaughtđối với tôi mà không hữu ích. Vì vậy, tôi đã thêm mã để in errorđối tượng và các thuộc tính của nó. if(error){ // message+=error; for(var propName in error) { propValue = error[propName] message+='error prop: '+propName+', value: '+propValue; } } . Điều này đã cung cấp thêm thông tin giúp tôi gỡ lỗi - ví dụerror prop: filename, value: blob:http://localhost:9881/11777e3a-28d8-414e-9047-cee7d328e843
Manu Chadha,

7

Đối với tôi, nó liên quan đến việc có một lời hứa được giải quyết trong ngOnInitthành phần. Tôi đã sử dụng async, fakeAsyncvà đánh dấu cũng như loại bỏ dần từng dịch vụ async vớispyOn

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

Angular - Cách đơn vị kiểm tra thành phần với cuộc gọi dịch vụ không đồng bộ


4

TL; DR: Nó có thể liên quan đến việc định tuyến thử nghiệm.

Tôi cũng nhận được [object ErrorEvent] thrown. Một giờ sau, truy tìm nó thành một dòng mã.

this.username = this.userService.getUser(this.route.snapshot.paramMap.get('id'))[0];

Vấn đề nằm ở môi trường thử nghiệm đang cố gắng đánh giá this.route.snapshot.paramMap.get('id').

Nếu tôi thay thế nó bằng 0, hãy [object ErrorEvent] thrownbiến mất.

UserService của tôi có một người dùng như vậy:

public users = [ ["admin", "First name", "Surname", etc... ] ].

Vì vậy, 0chỉ có được người dùng này, tại chỉ mục 0.

Nếu không, khi bình thường chạy ứng dụng của tôi, this.route.snapshot.paramMap.get('id')được đánh giá khi người dùng chọn một người dùng để chỉnh sửa từ bảng người dùng của tôi.

Vì vậy, trong HTML của tôi, *ngFor="let user of users; index as i"các vòng lặp để hiển thị tất cả người dùng sau đó routerLink="/edit/{{i}}"để bạn có thể nhấp vào các nút chỉnh sửa cho mỗi người dùng, khi nhấp vào sẽ chuyển đến ví dụ: http://localhost:4200/edit/0để chỉnh sửa chi tiết của người dùng quản trị nói trên.


3

những gì về việc làm sạch sau mỗi trường hợp thử nghiệm:

  afterEach(() => {
    TestBed.resetTestingModule();
  })

Tôi đọc ở đâu đó rằng TestBed vẫn được đặt lại cho mỗi lần kiểm tra.
bgerth

1
Tôi trường hợp của tôi nó đã giúp làm sạch cho các thử nghiệm tiếp theo.
Sebastian Brestin

1

Tôi đã từng gặp vấn đề tương tự. Một cách mà lỗi này xảy ra là khi bạn cố gắng truy cập bất kỳ thứ gì rỗng hoặc không xác định trong mẫu. Đảm bảo rằng bạn đã kiểm tra an toàn trên các biến đó.

Ví dụ, điều này sẽ ném [object: ErrorEvent] khi cấu hình không được xác định khi tải thành phần.

template.html

<div *ngIf="config.options">
   .....
   ......
</div>

Làm điều này thay thế

<div *ngIf="config?.options">
   .....
   ......
</div>

1

Điều có thể giúp ích là, nếu bạn mở cửa sổ Chrome cho người chạy thử nghiệm Karma của mình, để mở các công cụ dành cho nhà phát triển và kiểm tra bảng điều khiển ở đó. Đối với tôi, điều này đã giúp tôi phát hiện ra rằng ứng dụng không thể sử dụng phương thức Array.findIndex trên một mảng không xác định (vì cấu trúc dữ liệu được tổ chức theo chuỗi ngày, chẳng hạn như dữ liệu [2018] [3] [28], và Tôi đã tình cờ chỉ đến ngày sai), nhưng thay vì chỉ dừng lại ở lỗi, bài kiểm tra vẫn tiếp tục chạy.


Cảm ơn nhiều! Tôi dự kiến sẽ có các thông tin để có mặt trong giao diện điều khiển, bạn đã lưu một vài giờ trong cuộc sống của tôi :)
Sébastien Tromp

0

Đối với tôi, vấn đề là tôi đã có một bài kiểm tra mà tôi đã vô tình sử dụng thư viện auth0-lock .


0

Có vẻ như đây là sự cố không đồng bộ, vì sau khi tôi thêm đủ its vào một trong các thông số kỹ thuật thành phần của mình, tôi có thể nhận được thông báo lỗi có thể sử dụng được trỏ đến một tệp và dòng trong tệp đó (nó có liên quan đến paramMap.

Trong thông số kỹ thuật đã thử nghiệm ParamMap, tôi chỉ thêm:

  describe('this test', () => {
    it('will succeed', () => {
      expect(true).toBeTruthy();
    });

    it('will succeed', () => {
      expect(true).toBeTruthy();
    });

    it('will succeed', () => {
      expect(true).toBeTruthy();
    });

    it('will succeed', () => {
      expect(true).toBeTruthy();
    });
  });

0

Bạn có thể có một cuộc đua hoặc kiểm tra không đồng bộ không được thiết lập đúng cách hoặc được sử dụng không đúng cách. Tôi sẽ giả định rằng trường hợp gỡ lỗi cần được sửa và bỏ qua việc dòng lệnh đi qua. Chỉ cần tiếp tục làm mới trình chạy thử nghiệp nghiệp (trình duyệt) trong trường hợp lỗi [object ErrorEvent] thrownxuất hiện không liên tục, sau đó đảm bảo rằng bạn đã triển khai điều kiện không đồng bộ một cách chính xác.

Hy vọng rằng điều này hiệu quả.


0

[object ErrorEvent] được ném

Lỗi này cho thấy rằng bạn có một cái gì đó không xác định. Cách dễ nhất để gỡ lỗi nó từ kinh nghiệm của tôi là:

it('should create', () => {
    console.log(component);
    // You can check in the browser log which property is undefined
    });

Điều này thực sự đã trở thành lời nhắc hữu ích nhất: trong các thử nghiệm của tôi, tôi có một dịch vụ xác thực giả nhưng đã bỏ sót một phương pháp. Có vẻ như không liên quan, một trong các thử nghiệm trong một thành phần không thành công, nhưng không phải khi bị cô lập. Tôi đã theo dõi điều tối nghĩa [object ErrorEvent] thrownvề phương pháp thiếu từ xa đó chỉ nhờ vào console.log :)
RedDree

0

Trong trường hợp của tôi, vấn đề là với dịch vụ, vì một trong những đối tượng sẽ không được xác định trong quá trình chạy thử nghiệm.

Mẫu mã dịch vụ giống như bên dưới quyền truy cập vào dom,

  const elem = this.document.querySelector(element) as HTMLElement;
  elem.scrollIntoView({param1: ''});

Các thông số kỹ thuật đề cập đến dịch vụ này không thành công với lỗi ' [object ErrorEvent] được ném ra ".

Tôi đã chế nhạo đối tượng dịch vụ của mình bên trong tất cả các thông số kỹ thuật đề cập đến điều này và vấn đề đã được giải quyết.

Dịch vụ giả mạo

class MockService {
serviceMethod(div) : void {
  testElement = document.querySelector('div') as HTMLElement;
  return testElement;
  } 
}

Và sử dụng đối tượng dịch vụ giả này trong các nhà cung cấp như bên dưới,

beforeEach(async(() => {

TestBed.configureTestingModule({
  declarations: [Component],
  providers: [
     { provide: Service, useClass: MockService },
    ],
})
  .compileComponents();
}));

0

Tôi đang sử dụng proxy trong ứng dụng của mình được xác định trong proxy.conf.json như:

'/api': { 'target': 'some path', 'changeOrigin': false }

Bởi vì Karma không biết về proxy này, nó liên tục tạo ra các lỗi trong bảng điều khiển mà không thể tìm thấy điểm cuối API. Vì vậy, sau khi xem tài liệu Karma, tôi phát hiện ra rằng những gì tôi có thể làm là thêm thuộc tính "proxy" trong karma.conf.js với cùng một đối tượng từ proxy.conf.json:

proxies: { '/api': { 'target': 'some path', 'changeOrigin': false }}

Lỗi trong bảng điều khiển đã biến mất và [object errorEvent] không còn bị ném nữa.


-1

Cuối cùng, những gì có thể làm việc cho tôi:

    TestBed.resetTestingModule();
  })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.