আমি আমার কর্ম / জেসমিন পরীক্ষায় কীভাবে একটি "[অবজেক্ট ত্রুটিযুক্ত নিক্ষেপ" ত্রুটিটি ডিবাগ করব?


108

আমার বেশ কয়েকটি ব্যর্থ পরীক্ষা রয়েছে যা কেবলমাত্র আউটপুট দেয় [object ErrorEvent] thrown। আমি কনসোলে এমন কিছু দেখতে পাচ্ছি না যা আমাকে আপত্তিকর কোডটি নির্দিষ্ট করতে সহায়তা করে। এগুলি ট্র্যাক করার জন্য আমার কিছু করার দরকার আছে?

[সম্পাদনা]: আমি কর্ম v1.70 চালাচ্ছি, জেসমিন ভি 2.7.0


আপনি আরও ত্রুটি অন্তর্ভুক্ত করতে পারেন? এর আগে ও পরে একাধিক লাইনের ত্রুটি?
কেভিন

2
[object ErrorEvent] thrownআক্ষরিক সব এটি বলে। এর আগে বা পরে কিছুই নেই।
ড্যারেল ব্রোগডন

1
ভাগ্য যেমন এটি থাকত, আমি ঠিক তখনই এই সমস্যাটি পেয়েছিলাম যখন আপনি এই প্রশ্নটি পোস্ট করছেন, এটি একটি "দুর্বৃত্ত" স্ক্রিপ্ট ট্যাগ হিসাবে প্রমাণিত হয়েছিল (এটি CSS লিঙ্কও হতে পারে) যা অপসারণ করা দরকার (আমার সমস্যা সম্পর্কিত ছিল) সিওআরএসে) বা সিএসএসের ক্ষেত্রে আমি সবেমাত্র ক্রসরিগিন = "বেনামে" যুক্ত করেছি। এই জাতীয় স্ক্রিপ্ট / সিএসএস ট্যাগের জন্য আপনার কোড পরীক্ষা করুন, আমার ক্ষেত্রে আমি বিষয়টি সম্পূর্ণ আলাদা উপাদানটির কারণে খুঁজে পেয়েছি!
দ্যডুড

আপনি কৌণিক ক্লিপ হয় না? @ ড্যারেলব্রোগডন
কুনসেভিক.দেব

1
@ দ্যডুড কীভাবে আপনি এই স্ক্রিপ্টটি সংকুচিত করলেন? লাইনে লাইনে? অথবা এমন কোনও ডিবাগ প্রক্রিয়া ছিল যা আপনাকে যেখানে ছিল সেখানে সংকীর্ণ করতে সহায়তা করেছিল? আমার একই সমস্যা রয়েছে এবং আমার কেবলমাত্র একমাত্র তথ্যটিই বার্তাটি পাঠাতে হবে: সমস্তকিছুর পরে একটি ত্রুটি নিক্ষেপ করা হয়েছিল। আমি পরীক্ষা নিজেই বিছিন্ন তাহলে পরিবর্তন করে it()থেকে fit(), যদিও একক পরীক্ষা চলছে শুধু তাই নয়, ত্রুটি এখনো নিক্ষিপ্ত হচ্ছে। এই ধরণের ত্রুটির জন্য কোনও ডিবাগ সুপারিশ?
নাইট

উত্তর:


121

এফওয়াইআই: একবার আপনার পরীক্ষাগুলি চালানোর পরে আপনি খোলা ডেভটুলস কনসোল দ্বারা নিক্ষেপ করা সঠিক ত্রুটিটি খুঁজে পেতে পারেন ।

কুইকফিক্স হিসাবে আপনি সোর্স ম্যাপ ছাড়াই আপনার পরীক্ষা চালানোর চেষ্টা করতে পারেন :

সিএলআই v6.0.8 এবং উপরে
--source-map=false

CLI v6.0.x প্রারম্ভিক সংস্করণ
--sourceMap=false

সিএলআই ভি 1.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 এ এটি হয় না
মাইক 13

3
আমি এলোমেলো [অবজেক্ট অবজেক্ট] এলোমেলো উপাদানগুলিতে নিক্ষিপ্ত হয়েছি এবং কিছু রানে আমি কিছুই পাই না ...: এসআই অ্যাংুলার টেস্টিংকে ঘৃণা করে।
জেরার্ডো বুয়েনস্ট্রো গঞ্জালেজ

51

যদি সোর্সম্যাপ = মিথ্যা সাহায্য না করে, 1) চেষ্টা করুন আপনার ব্রাউজারটি পরীক্ষা চালাচ্ছেন 2) ডিবাগ বোতামে ক্লিক করুন 3) কনসোলটি খুলুন

ত্রুটি থাকবে

এখানে চিত্র বর্ণনা লিখুন


8
এমনকি আমার ডিবাগ বোতামটি ক্লিক করার দরকার নেই। খোলার বিকাশকারী কনসোলটি আমার পক্ষে কাজ করেছে।
chris31389

উজ্জ্বল! আমি সর্বত্র সোর্সম্যাপ বিকল্পটি যুক্ত করেছি, তবে শেষ পর্যন্ত এটি আমার প্রয়োজনীয় তথ্য দিয়েছে
SkarXa

1
--sourcemaps=falseজিনিস আমার জন্য কাজ করা হয় নি, কিন্তু এই flawlessly কাজ! ধন্যবাদ!
মিস্টারক্লিয়ান

পরীক্ষার ঠিক পরে ব্রাউজারটি বন্ধ হয়ে গেলে সত্যিই সহায়তা করে না। অনুমান করুন আমি উইন্ডোটি খোলা রাখার জন্য এক ধরণের অকেজো পরীক্ষাগুলি লিখব, যেমন একধরনের ক্যাভম্যান।
CoryCoolguy

24

আপনি যদি টার্মিনাল থেকে পরীক্ষা চালিয়ে আরও বর্ণনামূলক ত্রুটি বার্তা পান তবে এটি চেষ্টা করুন:

ng test -sm=false

আপনার পরীক্ষায়, আপনি প্রতিস্থাপন করতে পারেন

it('should...')

সঙ্গে

fit('should...') 

এখন কেবল ফিটের আগে পরীক্ষা করা হবে। পরীক্ষা চালানোর পরে ব্রাউজারটি খোলা রাখতে, পরীক্ষাটি এভাবে চালান:

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

ব্যক্তিগতভাবে, আমি এই ত্রুটি দুটিবার সম্মুখীন হয়েছি। উভয় কেবলমাত্র ফিকচার.ডেসটেক্ট চেঞ্জস () কল করার সময় ট্রিগার করা হয়েছিল।

প্রথম সময়, আমি আমার .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
@ ডায়ালানক্যাপ এটি পরীক্ষা করে যদি বস্তুর সম্পত্তিটি পড়ার চেষ্টা করার আগে বস্তুটি শূন্য হয়। আরও তথ্যের জন্য কৌণিক.ইউ / গুইড / স্টেম্পলেট- সায়েন্ট্যাক্স # নিরাপদ-ন্যাভিগেশন- সারণি দেখুন ।
খ্রিস্টান রোনডাউ

18

এটি হ'ল জুঁই ফ্রেমওয়ার্কটি ত্রুটি-বার্তা টাইপ পরিচালনা করতে পারে না তাই এটি ত্রুটি বার্তা এবং কলগুলি বের করে না error.toString() পরিবর্তে সেই বস্তুটিতে করে।

আমি কেবল জুঁই রেপোতে একটি সমস্যা দায়ের করেছি https://github.com/jasmine/jasmine/issues/1594

যতক্ষণ না এটি স্থির হয়, আপনি অস্থায়ীভাবে নোড_মডিউল ফোল্ডারে আপনার ইনস্টল করা জুঁই প্যাকেজটি প্যাচ করতে পারেন। আমার ক্ষেত্রে এটি হয়

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

এবং তারপরে এটি থেকে এক্সেপশন ফরমেটারের প্রয়োগ পরিবর্তন করুন

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
এটি আমার জন্য জুঁই-कोर @2.99.1 এ কাজ করেছে। যাইহোক, আমাকে এটি প্যাচ করতে হয়েছিল node_modules/jasmine_core/lib/jasmine_core/jasmine.js
রজার গারজা

এত ভাল - এই পোস্টটি সন্ধান করতে এক মিনিট সময় নিল তবে এটি আমার বাট সংরক্ষণ করেছিল। ধন্যবাদ। একই জুঁই-কোর সংস্করণ
মিঃ রজার্স

এটি পরিবর্তন করার পরে, এটি কেবল 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

টিএল; ডিআর: এটি রাউটিং পরীক্ষার সাথে সম্পর্কিত হতে পারে।

আমি পেয়ে করছি [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') হয় তখন যখন ব্যবহারকারী আমার ব্যবহারকারীর সারণী থেকে সম্পাদনা করার জন্য কোনও ব্যবহারকারী নির্বাচন করেন তখন মূল্যায়ন করা হয়।

সুতরাং আমার এইচটিএমএলে, *ngFor="let user of users; index as i"সমস্ত ব্যবহারকারীকে প্রদর্শন করার জন্য লুপগুলি রয়েছে routerLink="/edit/{{i}}"যাতে করে আপনি প্রতিটি ব্যবহারকারীর জন্য সম্পাদনা বোতামে ক্লিক করতে পারেন, যখন ক্লিক করা হয় উদাহরণস্বরূপ http://localhost:4200/edit/0উপরোক্ত প্রশাসনিক ব্যবহারকারীর বিবরণ সম্পাদনা করতে to


3

প্রতিটি পরীক্ষার কেস পরে পরিষ্কার সম্পর্কে কি:

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

আমি কোথাও পড়েছি যে টেস্টবেড প্রতিটি পরীক্ষার জন্য যাইহোক পুনরায় সেট করা হয়।
বৃহস্পতিবার

1
আমি আমার ক্ষেত্রে এটি পরবর্তী পরীক্ষার জন্য সাফ আপ করতে সহায়তা করে helped
সেবাস্তিয়ান Brestin

1

আমারও একই সমস্যা ছিল। এই ত্রুটিটি ঘটে যাওয়ার একটি উপায় হ'ল আপনি যখন টেমপ্লেটে নাল বা অপরিজ্ঞাত কোনও কিছু অ্যাক্সেস করার চেষ্টা করেন। আপনার সেই ভেরিয়েবলের নিরাপত্তা পরীক্ষা করা আছে তা নিশ্চিত করুন।

উদাহরণস্বরূপ এটি কনজেন্ট লোডের উপর কনফিগারেশন অপরিজ্ঞাতকৃত হলে [অবজেক্ট: ত্রুটিপূর্বক] ফেলে দেবে।

template.html

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

পরিবর্তে এটি করুন

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

1

সহায়তা কী তা হ'ল, যদি আপনার কর্মফল পরীক্ষার জন্য ক্রোম উইন্ডো খোলা থাকে, বিকাশকারী সরঞ্জাম খোলার জন্য এবং সেখানে কনসোলটি পরীক্ষা করতে। আমার জন্য, এটি আমাকে এটি নির্ধারণ করতে সহায়তা করেছে যে অ্যাপটি একটি অনির্ধারিত অ্যারেতে অ্যারে.ফাইন্ড ইন্ডেক্স পদ্ধতি ব্যবহার করতে পারে না (কারণ ডেটা কাঠামো একটি ডেট স্ট্রিং, যেমন ডেটা [2018] [3] [২৮] দ্বারা সংগঠিত হয়েছিল, এবং আমি ঘটেছে ভুল তারিখের দিকে ইঙ্গিত করে), তবে তবুও ত্রুটি থামানোর পরিবর্তে, পরীক্ষা চলতে থাকে।


একটি গুচ্ছ ধন্যবাদ! আমি কনসোলে তথ্যটি উপস্থিত থাকার প্রত্যাশা করতাম, আপনি আমার জীবনের কয়েক ঘন্টা বাঁচিয়েছিলেন :)
সাবেস্টিয়ান ট্রাম্প

0

আমার জন্য সমস্যাটি ছিল আমার একটি পরীক্ষা ছিল যেখানে আমি ঘটনাক্রমে লেখক-লক লাইব্রেরিটি ব্যবহার করছিলাম


0

এটি একটি অ্যাসিঙ্ক সমস্যা হিসাবে উপস্থিত হয়েছিল, কারণ আমি itআমার উপাদানগুলির একটিতে যথেষ্ট পরিমাণ যুক্ত করার পরে , আমি একটি ব্যবহারযোগ্য ত্রুটি বার্তা পেতে সক্ষম হয়েছি যা সেই ফাইলের মধ্যে একটি ফাইল এবং লাইনকে নির্দেশ করেছিল (এটি সম্পর্কিত ছিল)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

আপনার কাছে একটি প্রতিযোগিতা বা একটি অ্যাসিঙ্ক টেস্ট থাকতে পারে যা একেবারে ঠিক সেট আপ করা হয়নি বা ভুলভাবে ব্যবহৃত হয়েছে। আমি ধরে নেব যে ডিবাগ কেসটি ঠিক করা দরকার এবং কমান্ড লাইনটি চলে যায় তা উপেক্ষা করুন। ত্রুটি হলে কেবল কর্মফল রানার (ব্রাউজার) সতেজ রাখুন[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: ''});

এই পরিষেবাটি উল্লেখ করে এমন চশমা নিক্ষেপ করা ত্রুটিযুক্ত [[অবজেক্ট ত্রুটি- ঘটনা] দিয়ে ব্যর্থ হয়েছিল ' ।

আমি উল্লেখ করেছি এমন সমস্ত চশমার ভিতরে আমার পরিষেবাটির বিষয়টিকে উপহাস করেছিলাম এবং সমস্যাটি সমাধান হয়ে গেছে।

মোক পরিষেবা

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 }

কারমা এই প্রক্সি সম্পর্কে অবগত ছিল না, তাই এটি কনসোলে ত্রুটিগুলি চালিত করেছিল যে এপিআই শেষ পয়েন্টটি খুঁজে পাওয়া যায়নি। তাই কর্মের দলিলপত্র অনুসন্ধান করার পরে আমি জানতে পেরেছিলাম যে আমি যা করতে পারি তা হ'ল প্রক্সি.conf.json থেকে একই বস্তুর সাথে karma.conf.js এর "প্রক্সি" সম্পত্তি যুক্ত করা:

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

কনসোলে ত্রুটিটি চলে গিয়েছিল, এবং [অবজেক্ট ত্রুটি-ঘটনা] আর ছুঁড়ে দেওয়া হয়নি।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.