मैं अपने कर्म / चमेली परीक्षणों में एक "[ऑब्जेक्ट एररवेंट] फेंक दी गई" त्रुटि कैसे मिटा सकता हूं?


108

मेरे पास कई असफल परीक्षण हैं जो केवल आउटपुट करते हैं [object ErrorEvent] thrown। मुझे सांत्वना में कुछ भी दिखाई नहीं देता है जो मुझे अपमानजनक कोड को इंगित करने में मदद करता है। क्या मुझे इन पर नज़र रखने के लिए कुछ करने की ज़रूरत है?

[संपादित करें] मैं कर्मा v1.70, जैस्मीन v2.7.0 चला रहा हूं


क्या आप अधिक त्रुटि को शामिल कर सकते हैं? पहले और बाद में त्रुटि की कई पंक्तियों की तरह?
केविन

2
[object ErrorEvent] thrownसचमुच यह सब कहते हैं। पहले या बाद में कुछ भी नहीं है।
डेरेल ब्रोगडन

1
जैसा कि किस्मत में होगा, मुझे यह मुद्दा मिला है, जब आप इस प्रश्न को पोस्ट कर रहे थे, तो यह "बदमाश" स्क्रिप्ट टैग (यह सीएसएस लिंक भी हो सकता है) को हटा दिया गया था (मेरा मुद्दा संबंधित था) कोर्स), या सीएसएस के मामले में, मैंने अभी क्रॉसोरिगिन = "अनाम" जोड़ा है। इस तरह की स्क्रिप्ट / सीएसएस टैग के लिए अपने कोड की जांच करें, मेरे मामले में मुझे पूरी तरह से अलग घटक के कारण होने वाली समस्या मिली!
TheDude

क्या आप कोणीय हैं आप नहीं हैं? @ डारेलब्रॉगडन
कुंसविक.देव।

1
@ क्या आपने इस स्क्रिप्ट को कैसे छोटा किया? पंक्ति दर पंक्ति? या क्या कुछ डिबग प्रक्रिया थी जिसने आपको यह संकीर्ण करने में मदद की कि वह कहाँ थी? मैं एक ही मुद्दा है और केवल जानकारी मैं पर जाना है संदेश है: एक त्रुटि afterAll में फेंक दिया गया था। मैं परीक्षण ही अलग हैं बदलकर it()करने के लिए fit(), भले ही एक परीक्षण चल रहा है ही नहीं, त्रुटि अभी भी फेंक दिया जा रहा है। इस प्रकार की त्रुटि के लिए कोई डीबग अनुशंसा करता है?
नाइट

जवाबों:


121

FYI करें: आप सटीक त्रुटि केवल DevTools Console के द्वारा पा सकते हैं, जब आपके परीक्षण चल रहे हों।

एक उपसर्ग के रूप में आप अपने परीक्षण को बिना स्रोत के चलाने का प्रयास कर सकते हैं :

सीएलआई v6.0.8 और ऊपर
--source-map=false

सीएलआई v6.0.x प्रारंभिक संस्करण
--sourceMap=false

CLI v1.x
--sourcemaps=false

शॉर्टकट ng test -sm=falseभी काम कर सकता है

उस https://github.com/angular/angular-cli/issues/7296 पर एक खुला मुद्दा है

अद्यतन करें : मेरे पास वह मुद्दा भी था, इसलिए मैंने अभी नवीनतम क्ली में माइग्रेट किया और सुनिश्चित करें कि सभी पैकेज अपडेट किए गए package.jsonहैं मैंने पूरी तरह से पुनर्स्थापित कर दिया है node_modulesइसलिए अब यह मुद्दा समाप्त हो गया है।


3
यह मेरे लिए काम किया। इससे पता चला कि समस्या अपरिभाषित इनपुट बाइंडिंग के साथ थी।
जेपी ल्यू

10
कोणीय-क्ली 6 के लिए, --sourceMap=falseकाम करने लगता है।
skermajo

1
विशिष्ट फ्रंट सॉल्यूशन
मैकस्की

1
यह समाधान अब काम नहीं करता है। यह प्रयोग किया जाता है, लेकिन 6.2.4 में यह नहीं है
माइक

3
मुझे रैंडम कंपोनेंट्स में अनटाइटेड [ऑब्जेक्ट ऑब्जेक्ट] मिलता है और कुछ रनों में मुझे कुछ नहीं मिलता ...: SI को Angular टेस्टिंग से नफरत है।
गेरार्डो बुनेरोस्त्रो गोंजालेज जू

51

यदि sourcemap = false मदद नहीं करता है, तो 1) परीक्षण को चलाने वाले अपने ब्राउज़र को खोलें 2) डिबग बटन पर क्लिक करें 3) कंसोल खोलें

त्रुटि तो होगी ही

यहां छवि विवरण दर्ज करें


8
मुझे डिबग बटन पर क्लिक करने की भी आवश्यकता नहीं थी। सिर्फ डेवलपर कंसोल खोलने से मेरे लिए काम किया।
chris31389

प्रतिभाशाली! मैंने हर जगह सोर्समैप विकल्प जोड़ा, लेकिन अंत में इससे मुझे वह जानकारी
मिली जिसकी

1
--sourcemaps=falseबात मेरे लिए काम नहीं कर रहा था, लेकिन यह दोषरहित काम किया! धन्यवाद!
mrClean

यदि परीक्षण के ठीक बाद ब्राउज़र बंद हो जाता है तो वास्तव में मदद नहीं करता है। मुझे लगता है मैं खिड़की के खुले रखने के लिए बेकार परीक्षणों का एक गुच्छा लिखूंगा, जैसे किसी तरह के गुफाओं में।
CoryCoolguy

24

यदि आप टर्मिनल से परीक्षण चलाकर अधिक वर्णनात्मक त्रुटि संदेश प्राप्त करते हैं, तो इस तरह से प्रयास करें:

ng test -sm=false

आपके परीक्षण में, आप प्रतिस्थापित कर सकते हैं

it('should...')

साथ में

fit('should...') 

अब केवल फिट होने से पहले के परीक्षण चलेंगे। परीक्षण चलाने के बाद ब्राउज़र को खुला छोड़ने के लिए, परीक्षण को इस तरह से चलाएं:

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

व्यक्तिगत रूप से, मुझे दो बार इस त्रुटि का सामना करना पड़ा है। फिक्सचर .etectChanges () कहते समय दोनों को केवल ट्रिगर किया गया था।

पहली बार, मैं इसे अपने .html फ़ाइल में अधिक सुरक्षित रूप से स्ट्रिंग प्रक्षेप का उपयोग करके हल किया।

असुरक्षित उदाहरण:

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

सुरक्षित (r) उदाहरण (प्रश्न चिह्न पर ध्यान दें):

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

वही संपत्ति बंधन पर लागू हो सकता है:

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

दूसरी बार, मैं अपने .html फ़ाइल में एक DatePipe उपयोग कर रहा था, लेकिन नकली संपत्ति है कि मैं पर यह प्रयोग किया जाता एक तारीख नहीं था।

.html फ़ाइल:

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

.ts (नकली-डेटा) फ़ाइल ( गलत ):

let startDate = 'blablah';

.ts (नकली-डेटा) फ़ाइल ( सही ):

let startDate = '2018-01-26';

कोई टिप्पणी क्यों? ' स्ट्रिंग व्याख्या अधिक सुरक्षित है? यह मेरे परिदृश्य में काम करता है।
डायलन कप

2
@DylanKapp यह जांचता है कि ऑब्जेक्ट की संपत्ति को पढ़ने की कोशिश करने से पहले ऑब्जेक्ट अशक्त है या नहीं। अधिक जानकारी के लिए angular.io/guide/template-syntax#safe-navigation-operator देखें ।
ईसाई रोंडेउ

18

ऐसा इसलिए है क्योंकि चमेली फ्रेमवर्क एररवेंट प्रकार को नहीं संभाल सकता है इसलिए यह त्रुटि संदेश और कॉल error.toString()को उस ऑब्जेक्ट पर नहीं निकालता है ।

मैंने सिर्फ चमेली के रेपो https://github.com/jasmine/jasmine/issues/1594 पर एक मुद्दा दायर किया

जब तक यह तय नहीं होता है, आप अपने स्थापित चमेली पैकेज को नोड_मॉड्यूल्स फ़ोल्डर में अस्थायी रूप से पैच कर सकते हैं। मेरे मामले में यह है

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';
}

इसके लिए

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

यह मुद्दे की पहचान करने में मदद करता है।


3
इसने मेरे लिए jasmine-core@2.99.1 में काम किया। हालाँकि, मुझे इसे पैच करना था node_modules/jasmine_core/lib/jasmine_core/jasmine.js
रोजर गरजा

इतना अच्छा - इस पोस्ट को खोजने में एक मिनट लगा लेकिन इसने मेरे बट को बचा लिया। धन्यवाद। समान चमेली-कोर संस्करण
mr rogers

इसे बदलने के बाद, यह केवल uncaughtमेरे लिए मुद्रित हुआ जो सहायक नहीं था। इसलिए मैंने errorऑब्जेक्ट और उसके गुणों को प्रिंट करने के लिए कोड जोड़ा । if(error){ // message+=error; for(var propName in error) { propValue = error[propName] message+='error prop: '+propName+', value: '+propValue; } } । इसने अतिरिक्त जानकारी प्रदान की जिससे मुझे डिबगिंग में मदद मिली - जैसेerror prop: filename, value: blob:http://localhost:9881/11777e3a-28d8-414e-9047-cee7d328e843
मनु चड्ढा

7

मेरे लिए यह ngOnInitएक घटक में हल किए गए वादे से संबंधित था । मुझे उपयोग करना था async, fakeAsyncऔर साथ ही एसिंक्रोस सेवा को बाहर निकालने के लिए टिक करना थाspyOn

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

कोणीय - अतुल्यकालिक सेवा कॉल के साथ इकाई परीक्षण घटक कैसे


4

TL; DR: यह परीक्षण मार्ग से संबंधित हो सकता है।

मुझे [object ErrorEvent] thrownभी हो रही है। एक घंटे बाद, इसे कोड की एक पंक्ति में खोजा गया।

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

समस्या का मूल्यांकन करने का प्रयास कर रहे परीक्षण वातावरण के साथ है this.route.snapshot.paramMap.get('id')

अगर मैं इसे बदल देता हूं 0, तो [object ErrorEvent] thrownचला जाता है।

मेरे उपयोगकर्ता सेवा में ऐसा उपयोगकर्ता है:

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

तो 0बस इस उपयोगकर्ता, सूचकांक पर हो जाता है 0

अन्यथा जब सामान्य रूप से मेरा ऐप चल रहा होता है, this.route.snapshot.paramMap.get('id')तब मूल्यांकन किया जाता है जब उपयोगकर्ता मेरे उपयोगकर्ताओं की तालिका से संपादित करने के लिए उपयोगकर्ता का चयन करता है।

इसलिए मेरे HTML में, *ngFor="let user of users; index as i"सभी उपयोगकर्ताओं को प्रदर्शित करने के लिए लूप्स हैं , routerLink="/edit/{{i}}"इसलिए आप प्रत्येक उपयोगकर्ता के लिए संपादन बटन पर क्लिक कर सकते हैं, जिस पर क्लिक करने के लिए उदाहरण के http://localhost:4200/edit/0लिए उपरोक्त उपयोगकर्ता के विवरण को संपादित करने के लिए उदाहरण के लिए जाएं।


3

प्रत्येक परीक्षण मामले के बाद सफाई के बारे में क्या:

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

मैंने कहीं पढ़ा है कि TestBed प्रत्येक परीक्षण के लिए वैसे भी रीसेट है।
बर्थ

1
मुझे मेरा मामला यह अगले परीक्षणों के लिए सफाई में मदद करता है।
सेबस्टियन ब्रिस्टिन

1

मुझे भी यही समस्या थी। यह त्रुटि तब होती है जब आप टेम्पलेट में कुछ भी अशक्त या अपरिभाषित होने का प्रयास करते हैं। सुनिश्चित करें कि आपके पास उन चर पर सुरक्षा जाँच है।

उदाहरण के लिए यह फेंक देगा [ऑब्जेक्ट: ErrorEvent] जब घटक लोड पर कॉन्फ़िगर अपरिभाषित है।

template.html

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

इसके बजाय ऐसा करें

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

1

मदद क्या है, यदि आपके पास अपने कर्म परीक्षण धावक के लिए क्रोम विंडो खुली है, तो डेवलपर टूल खोलने के लिए और वहां कंसोल की जांच करें। मेरे लिए, इससे मुझे यह पता लगाने में मदद मिली कि ऐप एक अपरिभाषित सरणी पर Array.findIndex विधि का उपयोग नहीं कर सका (क्योंकि डेटा संरचना डेट स्ट्रिंग द्वारा आयोजित की गई थी, जैसे डेटा [2018] [3] [28], और मैं गलत तारीख की ओर इशारा करता हुआ), लेकिन अभी तक गलती पर रुकने के बजाय, परीक्षा चलती रही।


बहुत बहुत धन्यवाद! मुझे उम्मीद है कि जानकारी कंसोल में मौजूद होगी, आपने मेरे जीवन के कुछ घंटों को बचाया :)
सेबास्टियन टेंप

0

मेरे लिए मुद्दा यह था कि मेरे पास एक परीक्षण था जहां मैं गलती से उपयोग कर रहा था ओर्ट-लॉक लाइब्रेरी ।


0

यह एक async समस्या प्रतीत हुई, क्योंकि जब मैंने itअपने एक घटक ऐनक में पर्याप्त एस जोड़ दिया , तो मुझे एक प्रयोग करने योग्य त्रुटि संदेश प्राप्त करने में सक्षम था, जिसने उस फ़ाइल के भीतर एक फ़ाइल और लाइन को इंगित किया (यह संबंधित था)paramMap

ParamMap का परीक्षण करने वाली कल्पना में, मैंने अभी जोड़ा:

  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

आपके पास एक दौड़ या एक async परीक्षण हो सकता है जो बिल्कुल सही नहीं है या गलत तरीके से उपयोग किया जाता है। मैं यह मानूंगा कि डिबग मामले को ठीक करने की आवश्यकता है और इसे अनदेखा करें कि कमांड लाइन गुजरती है। बस त्रुटि के मामले में कर्म परीक्षण धावक (ब्राउज़र) को ताज़ा करते रहें[object ErrorEvent] thrown रुक-रुक कर प्रकट होती है, तो सुनिश्चित करें कि आपने एसिंक्स स्थिति को सही ढंग से लागू किया है।

उम्मीद है कि यह काम करता है।


0

[ऑब्जेक्ट एररवेंट] फेंक दिया गया

यह त्रुटि दर्शाती है कि आपके पास कुछ अपरिभाषित है। मेरे अनुभव से इसे डीबग करने का सबसे आसान तरीका है:

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

यह वास्तव में सभी का सबसे उपयोगी अनुस्मारक बन गया है: मेरे परीक्षणों में मेरे पास एक नकली प्रमाणीकरण सेवा है, जो एक विधि से चूक गई। सीमांत रूप से असंबंधित, घटक में परीक्षणों में से एक विफल रहा, लेकिन अलग नहीं होने पर। मैंने [object ErrorEvent] thrownउस रिमोट गुम विधि को केवल
सांत्वना की बदौलत

0

मेरे मामले में समस्या सेवा के साथ थी, क्योंकि चल रहे परीक्षणों के दौरान ऑब्जेक्ट में से एक को अपरिभाषित किया जाना चाहिए।

सेवा कोड का नमूना कुछ इस तरह था कि नीचे से डोम तक पहुंच,

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

इस सेवा का उल्लेख करने वाले चश्मे ' [ऑब्जेक्ट ErrorEvent] फेंके गए ' त्रुटि के साथ विफल हो रहे थे ।

मैंने सभी स्पेक्स के अंदर अपनी सर्विस ऑब्जेक्ट का मज़ाक उड़ाया जो इस बात का जिक्र कर रहे थे और समस्या हल हो गई।

नकली सेवा

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

और नीचे दिए गए प्रदाताओं के रूप में इस नकली सेवा वस्तु का उपयोग करें,

beforeEach(async(() => {

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

0

मैं अपने आवेदन में एक प्रॉक्सी का उपयोग कर रहा था जो प्रॉक्सी में परिभाषित है ।conf.json जैसे:

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

क्योंकि कर्म को इस प्रॉक्सी के बारे में पता नहीं था, इसलिए यह कंसोल में त्रुटियों को दूर करता रहा जो कि एपीआई एंडपॉइंट को नहीं मिला। इसलिए कर्म प्रलेखन में देखने के बाद, मुझे पता चला कि मैं क्या कर सकता था "प्रॉक्सी" संपत्ति को कर्म में जोड़ना था। प्रॉक्सी से एक ही वस्तु के साथ। bf.json:

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

कंसोल में त्रुटि चली गई थी, और [ऑब्जेक्ट एररवेंट] अब फेंका नहीं गया था।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.