যদিও সর্বাধিক ভোট প্রাপ্ত উত্তরগুলি কাজ করে, তারা ভাল পরীক্ষার অনুশীলন প্রদর্শন করে না, তাই আমি ভেবেছিলাম যে আমি কিছু বাস্তব উদাহরণ দিয়ে গন্টারের উত্তরটি প্রসারিত করব ।
আসুন কল্পনা করুন যে আমাদের নীচের সহজ উপাদান রয়েছে:
@Component({
selector: 'my-demo',
template: `
<button (click)="buttonClicked()">Click Me!</button>
`
})
export class DemoComponent {
@Output() clicked = new EventEmitter<string>();
constructor() { }
buttonClicked(): void {
this.clicked.emit('clicked!');
}
}
উপাদানটি হ'ল পরীক্ষার অধীনে থাকা সিস্টেমটি, এর কিছু অংশে গুপ্তচরবৃত্তিগুলি এনক্যাপসুলেশনকে ভেঙে দেয়। কৌণিক উপাদান পরীক্ষাগুলিতে কেবল তিনটি বিষয় সম্পর্কে জানা উচিত:
- ডোম (উদাহরণস্বরূপ অ্যাক্সেস করা
fixture.nativeElement.querySelector);
@Inputএস এবং @Outputএস এর নাম ; এবং
- সহযোগিতা সেবা (ডিআই সিস্টেমের মাধ্যমে ইনজেকশন করা)।
উদাহরণস্বরূপ প্রত্যক্ষ পদ্ধতিতে অনুরোধ করা বা উপাদানগুলির অংশগুলির গুপ্তচরবৃত্তি জড়িত যে কোনও কিছুই বাস্তবায়নের সাথে খুব ঘনিষ্ঠভাবে মিলিত হয় এবং রিফ্যাক্টরেটিংয়ের সাথে ঘর্ষণ যোগ করবে - পরীক্ষার দ্বিগুণ কেবলমাত্র সহযোগীদের জন্য ব্যবহার করা উচিত। এই ক্ষেত্রে, আমাদের কোনও সহযোগী না থাকায় আমাদের কোনও উপহাস, গুপ্তচর বা অন্যান্য পরীক্ষার দ্বিগুণ হওয়া উচিত নয় ।
এটি পরীক্ষা করার একটি উপায় হ'ল সরাসরি ইমেটারে সাবস্ক্রাইব করে, তারপরে ক্লিক অ্যাকশনটি চাওয়া ( ইনপুট এবং আউটপুট সহ উপাদানটি দেখুন ):
describe('DemoComponent', () => {
let component: DemoComponent;
let fixture: ComponentFixture<DemoComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ DemoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DemoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should emit when clicked', () => {
let emitted: string;
component.clicked.subscribe((event: string) => {
emitted = event;
});
fixture.nativeElement.querySelector('button').click();
expect(emitted).toBe('clicked!');
});
});
যদিও এটি সরাসরি উপাদান উপাদানটির সাথে ইন্টারঅ্যাক্ট করে, এর নামটি @Outputপাবলিক এপিআইয়ের অংশ, সুতরাং এটি খুব শক্তভাবে মিলিত হয় না।
বিকল্পভাবে, আপনি একটি সাধারণ পরীক্ষা হোস্ট তৈরি করতে পারেন ( একটি পরীক্ষার হোস্টের অভ্যন্তর দেখুন ) এবং আসলে আপনার উপাদানটি মাউন্ট করতে পারেন:
@Component({
selector: 'test-host',
template: `
<my-demo (clicked)="onClicked($event)"></my-demo>
`
})
class TestHostComponent {
lastClick = '';
onClicked(value: string): void {
this.lastClick = value;
}
}
তারপরে প্রসঙ্গে উপাদানটির পরীক্ষা করুন:
describe('DemoComponent', () => {
let component: TestHostComponent;
let fixture: ComponentFixture<TestHostComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ TestHostComponent, DemoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestHostComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should emit when clicked', () => {
fixture.nativeElement.querySelector('button').click();
expect(component.lastClick).toBe('clicked!');
});
});
componentInstanceএখানে পরীক্ষা হোস্ট , তাই আমরা নিশ্চিত যে আমরা মাত্রাতিরিক্ত উপাদান আমরা আসলে পরীক্ষা করছি করার মিলিত করছি না হতে পারে।