{"id":30325,"date":"2025-09-26T17:14:03","date_gmt":"2025-09-26T14:14:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=30325"},"modified":"2025-09-26T17:27:31","modified_gmt":"2025-09-26T14:27:31","slug":"angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/","title":{"rendered":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131<\/h2>\n<p>Angular uygulamalar\u0131, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir ve genellikle dinamik, etkile\u015fimli kullan\u0131c\u0131 deneyimleri sunar. Bu deneyimlerin \u00e7o\u011fu, HTTP istekleri, zamanlay\u0131c\u0131lar, Promise&#8217;ler ve Observable&#8217;lar gibi asenkron i\u015flemler arac\u0131l\u0131\u011f\u0131yla elde edilir. Ancak, asenkron kodun test edilmesi, senkron kodun test edilmesine g\u00f6re daha karma\u015f\u0131k ve zorlay\u0131c\u0131d\u0131r. Asenkron i\u015flemlerin tamamlanmas\u0131n\u0131 beklemek, testlerin karars\u0131z olmas\u0131na (flaky tests) veya gere\u011finden uzun s\u00fcrmesine neden olabilir.<\/p>\n<p>Angular, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in iki g\u00fc\u00e7l\u00fc ara\u00e7 sunar: <code>waitForAsync<\/code> ve <code>fakeAsync<\/code>. Bu makale, her iki arac\u0131n ne oldu\u011funu, ne zaman kullan\u0131laca\u011f\u0131n\u0131, nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 ve Angular test stratejinizde nas\u0131l optimize edece\u011finizi derinlemesine inceleyecektir.<\/p>\n<h3>Asenkron \u0130\u015flemler ve Test Etmenin Zorluklar\u0131<\/h3>\n<p>Bir Angular uygulamas\u0131nda asenkron i\u015flemlerle s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131rs\u0131n\u0131z:<\/p>\n<p>*   <strong>HTTP \u0130stekleri:<\/strong> Bir API&#8217;den veri \u00e7ekmek veya sunucuya veri g\u00f6ndermek.<br \/>\n*   <strong>Zamanlay\u0131c\u0131lar:<\/strong> <code>setTimeout<\/code> veya <code>setInterval<\/code> gibi JavaScript fonksiyonlar\u0131 ile belirli bir s\u00fcre sonra veya d\u00fczenli aral\u0131klarla kod \u00e7al\u0131\u015ft\u0131rmak.<br \/>\n*   <strong>Promise&#8217;ler:<\/strong> Asenkron bir i\u015flemin ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z sonucunu temsil eden nesneler.<br \/>\n*   <strong>Observable&#8217;lar:<\/strong> RxJS k\u00fct\u00fcphanesinin temelini olu\u015fturan, zamanla yay\u0131lan veri ak\u0131\u015flar\u0131n\u0131 temsil eden g\u00fc\u00e7l\u00fc yap\u0131lar.<\/p>\n<p>Bu i\u015flemler, kodunuzun y\u00fcr\u00fct\u00fclme s\u0131ras\u0131n\u0131 etkiler ve test ortam\u0131nda beklenen davran\u0131\u015f\u0131n sa\u011flanmas\u0131 i\u00e7in \u00f6zel yakla\u015f\u0131mlar gerektirir. Varsay\u0131lan olarak, bir test blo\u011fu (\u00f6rne\u011fin, <code>it()<\/code> fonksiyonu) i\u00e7indeki kod senkron olarak \u00e7al\u0131\u015f\u0131r. E\u011fer test, asenkron bir i\u015flemin sonucuna ba\u011fl\u0131ysa ve bu i\u015flem tamamlanmadan test bitiyorsa, test ba\u015far\u0131s\u0131z olur veya yanl\u0131\u015f sonu\u00e7lar verir. \u0130\u015fte bu noktada <code>waitForAsync<\/code> ve <code>fakeAsync<\/code> devreye girer.<\/p>\n<h3>waitForAsync Kullan\u0131m\u0131<\/h3>\n<p><code>waitForAsync<\/code>, Angular&#8217;\u0131n test yard\u0131mc\u0131lar\u0131ndan biridir ve Zone.js ile entegre \u00e7al\u0131\u015farak asenkron i\u015flemlerin tamamlanmas\u0131n\u0131 <em>ger\u00e7ekten<\/em> bekler. \u00d6zellikle ger\u00e7ek zamanl\u0131 asenkron operasyonlar\u0131 (\u00f6rne\u011fin, HTTP istekleri veya karma\u015f\u0131k Observable zincirleri) test ederken idealdir.<\/p>\n<h4>waitForAsync Nedir?<\/h4>\n<p><code>waitForAsync<\/code>, bir test blo\u011funun i\u00e7ine sarmalanan asenkron i\u015flemlerin tamamlanmas\u0131n\u0131 beklemek i\u00e7in kullan\u0131lan bir fonksiyondur. Zone.js&#8217;in g\u00fcc\u00fcnden yararlanarak, test ortam\u0131nda ba\u015flat\u0131lan t\u00fcm asenkron g\u00f6revlerin (makro g\u00f6revler ve mikro g\u00f6revler dahil) bitmesini izler. Test, t\u00fcm bu g\u00f6revler tamamland\u0131\u011f\u0131nda sona erer.<\/p>\n<h4>Ne Zaman waitForAsync Kullan\u0131l\u0131r?<\/h4>\n<p>*   <strong>Ger\u00e7ek HTTP \u0130stekleri:<\/strong> Bir servis arac\u0131l\u0131\u011f\u0131yla yap\u0131lan HTTP \u00e7a\u011fr\u0131lar\u0131n\u0131 test ederken, \u00f6zellikle <code>HttpClientTestingModule<\/code> kullan\u0131yorsan\u0131z.<br \/>\n*   <strong>Karma\u015f\u0131k Observable Zincirleri:<\/strong> <code>delay<\/code>, <code>debounceTime<\/code>, <code>throttleTime<\/code> gibi zaman tabanl\u0131 RxJS operat\u00f6rleri i\u00e7eren veya i\u00e7 i\u00e7e ge\u00e7mi\u015f asenkron ak\u0131\u015flara sahip Observable&#8217;lar\u0131 test ederken.<br \/>\n*   <strong><code>Promise<\/code>&#8216;ler ve <code>async\/await<\/code>:<\/strong> <code>Promise<\/code> tabanl\u0131 kodlar\u0131 veya <code>async\/await<\/code> s\u00f6zdizimi ile yaz\u0131lm\u0131\u015f fonksiyonlar\u0131 test ederken.<br \/>\n*   <strong>D\u0131\u015f K\u00fct\u00fcphaneler:<\/strong> Zone.js taraf\u0131ndan izlenen ve kontrol edilemeyen d\u0131\u015f k\u00fct\u00fcphanelerin asenkron i\u015flemlerini test ederken.<\/p>\n<h4>waitForAsync Nas\u0131l Kullan\u0131l\u0131r?<\/h4>\n<p><code>waitForAsync<\/code>, <code>it()<\/code> blo\u011funun callback fonksiyonunu sarmalar. Genellikle <code>async\/await<\/code> ile birlikte kullan\u0131larak daha okunabilir bir kod sa\u011flar. Ayr\u0131ca, <code>fixture.whenStable()<\/code> Promise&#8217;ini kullanarak Angular&#8217;\u0131n t\u00fcm asenkron i\u015flemleri tamamlamas\u0131n\u0131 bekleyebilirsiniz.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, bir servisten veri \u00e7eken ve bu veriyi g\u00f6r\u00fcnt\u00fcleyen bir bile\u015fenin nas\u0131l test edilece\u011fini g\u00f6rece\u011fiz.<\/p>\n<pre><code class=\"language-typescript\">import { Component, OnInit } from '@angular\/core';\r\nimport { HttpClient } from '@angular\/common\/http';\r\nimport { Observable } from 'rxjs';\r\nimport { delay } from 'rxjs\/operators';\r\n\r\ninterface Item {\r\n  id: number;\r\n  name: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'app-data',\r\n  template: <code>\r\n    <h2>Veri Listesi<\/h2>\r\n    <div *ngIf=\"loading\">Y\u00fckleniyor...<\/div>\r\n    <ul *ngIf=\"items &#038;&#038; !loading\">\r\n      <li *ngFor=\"let item of items\">{{ item.name }}<\/li>\r\n    <\/ul>\r\n    <div *ngIf=\"error\">Veri y\u00fcklenirken bir hata olu\u015ftu.<\/div>\r\n  <\/code>,\r\n})\r\nexport class DataComponent implements OnInit {\r\n  items: Item[] | undefined;\r\n  loading = false;\r\n  error = false;\r\n\r\n  constructor(private http: HttpClient) {}\r\n\r\n  ngOnInit(): void {\r\n    this.loading = true;\r\n    this.http.get<Item[]>('\/api\/items')\r\n      .pipe(delay(500)) \/\/ Asenkron gecikmeyi sim\u00fcle edelim\r\n      .subscribe({\r\n        next: (data) => {\r\n          this.items = data;\r\n          this.loading = false;\r\n        },\r\n        error: (err) => {\r\n          console.error('HTTP Error:', err);\r\n          this.error = true;\r\n          this.loading = false;\r\n        }\r\n      });\r\n  }\r\n}<\/code><\/pre>\n<p>\u015eimdi bu bile\u015feni <code>waitForAsync<\/code> kullanarak test edelim:<\/p>\n<pre><code class=\"language-typescript\">import { ComponentFixture, TestBed, waitForAsync } from '@angular\/core\/testing';\r\nimport { HttpClientTestingModule, HttpTestingController } from '@angular\/common\/http\/testing';\r\nimport { DataComponent } from '.\/data.component';\r\nimport { NO_ERRORS_SCHEMA } from '@angular\/core';\r\n\r\ndescribe('DataComponent with waitForAsync', () => {\r\n  let component: DataComponent;\r\n  let fixture: ComponentFixture<DataComponent>;\r\n  let httpTestingController: HttpTestingController;\r\n\r\n  beforeEach(waitForAsync(() => {\r\n    TestBed.configureTestingModule({\r\n      imports: [HttpClientTestingModule],\r\n      declarations: [DataComponent],\r\n      schemas: [NO_ERRORS_SCHEMA] \/\/ Basitlik i\u00e7in di\u011fer bile\u015fenleri g\u00f6rmezden gel\r\n    }).compileComponents();\r\n  }));\r\n\r\n  beforeEach(() => {\r\n    fixture = TestBed.createComponent(DataComponent);\r\n    component = fixture.componentInstance;\r\n    httpTestingController = TestBed.inject(HttpTestingController); \/\/ TestBed.get yerine TestBed.inject\r\n  });\r\n\r\n  afterEach(() => {\r\n    httpTestingController.verify(); \/\/ Bekleyen HTTP isteklerinin olmad\u0131\u011f\u0131n\u0131 do\u011frula\r\n  });\r\n\r\n  it('bile\u015fen olu\u015fturulmal\u0131', () => {\r\n    expect(component).toBeTruthy();\r\n  });\r\n\r\n  it('HTTP iste\u011fi tamamland\u0131ktan sonra veriyi y\u00fcklemeli', waitForAsync(async () => {\r\n    const mockItems: Item[] = [\r\n      { id: 1, name: '\u00d6\u011fe 1' },\r\n      { id: 2, name: '\u00d6\u011fe 2' }\r\n    ];\r\n\r\n    fixture.detectChanges(); \/\/ ngOnInit'i tetikler, HTTP iste\u011fi ba\u015flar\r\n\r\n    \/\/ Y\u00fckleniyor mesaj\u0131 g\u00f6r\u00fcnmeli\r\n    expect(fixture.nativeElement.querySelector('div').textContent).toContain('Y\u00fckleniyor...');\r\n\r\n    \/\/ Bekleyen HTTP iste\u011fini yakala ve yan\u0131tla\r\n    const req = httpTestingController.expectOne('\/api\/items');\r\n    expect(req.request.method).toEqual('GET');\r\n    req.flush(mockItems); \/\/ \u0130ste\u011fe yan\u0131t g\u00f6nder\r\n\r\n    \/\/ fixture.whenStable() t\u00fcm asenkron g\u00f6revlerin (delay dahil) tamamlanmas\u0131n\u0131 bekler.\r\n    \/\/ Bu, Zone.js taraf\u0131ndan izlenen t\u00fcm makro ve mikro g\u00f6revleri kapsar.\r\n    await fixture.whenStable();\r\n\r\n    fixture.detectChanges(); \/\/ DOM'u g\u00fcncelle\r\n\r\n    \/\/ Y\u00fckleniyor mesaj\u0131 kaybolmal\u0131\r\n    expect(fixture.nativeElement.querySelector('div')).toBeNull();\r\n\r\n    \/\/ Veriler do\u011fru \u015fekilde y\u00fcklenmeli ve g\u00f6sterilmeli\r\n    expect(component.items).toEqual(mockItems);\r\n    const listItems = fixture.nativeElement.querySelectorAll('li');\r\n    expect(listItems.length).toBe(2);\r\n    expect(listItems[0].textContent).toContain('\u00d6\u011fe 1');\r\n    expect(listItems[1].textContent).toContain('\u00d6\u011fe 2');\r\n  }));\r\n\r\n  it('HTTP iste\u011fi hata verdi\u011finde hata mesaj\u0131n\u0131 g\u00f6stermeli', waitForAsync(async () => {\r\n    fixture.detectChanges(); \/\/ ngOnInit'i tetikler, HTTP iste\u011fi ba\u015flar\r\n\r\n    const req = httpTestingController.expectOne('\/api\/items');\r\n    expect(req.request.method).toEqual('GET');\r\n    req.error(new ErrorEvent('Network error'), { status: 500, statusText: 'Server Error' });\r\n\r\n    await fixture.whenStable(); \/\/ Hata i\u015fleyicisinin tamamlanmas\u0131n\u0131 bekle\r\n\r\n    fixture.detectChanges(); \/\/ DOM'u g\u00fcncelle\r\n\r\n    \/\/ Hata mesaj\u0131 g\u00f6r\u00fcnmeli\r\n    expect(fixture.nativeElement.querySelector('div').textContent).toContain('hata olu\u015ftu');\r\n    expect(component.error).toBeTrue();\r\n  }));\r\n});<\/code><\/pre>\n<p>Bu \u00f6rnekte:<br \/>\n*   <code>beforeEach(waitForAsync(...))<\/code> kullanarak test mod\u00fcl\u00fcn\u00fcn asenkron olarak yap\u0131land\u0131r\u0131lmas\u0131n\u0131 bekliyoruz.<br \/>\n*   <code>it('...', waitForAsync(async () => { ... }))<\/code> ile test blo\u011funu <code>waitForAsync<\/code> i\u00e7ine al\u0131yoruz. <code>async<\/code> anahtar kelimesi, <code>await<\/code> kullanmam\u0131z\u0131 sa\u011flar.<br \/>\n*   <code>httpTestingController<\/code> ile HTTP iste\u011fini mock&#8217;luyor ve yan\u0131t\u0131n\u0131 kontrol ediyoruz.<br \/>\n*   <code>req.flush(mockItems)<\/code> ile servisten gelen yan\u0131t\u0131 sim\u00fcle ediyoruz.<br \/>\n*   <code>await fixture.whenStable()<\/code> kritik bir ad\u0131md\u0131r. Bu, Angular&#8217;\u0131n Zone.js taraf\u0131ndan izlenen t\u00fcm asenkron g\u00f6revlerinin (\u00f6rne\u011fin, Observable&#8217;daki <code>delay<\/code> operat\u00f6r\u00fc) tamamlanmas\u0131n\u0131 bekler. Bu olmadan, <code>delay<\/code> s\u00fcresi bitmeden test devam edebilir ve yanl\u0131\u015f sonu\u00e7lar verebilir.<\/p>\n<h4>waitForAsync Avantajlar\u0131 ve Dezavantajlar\u0131<\/h4>\n<p><strong>Avantajlar\u0131:<\/strong><br \/>\n*   <strong>Ger\u00e7ek\u00e7i Test Ortam\u0131:<\/strong> Asenkron kodunuzu ger\u00e7ek \u00e7al\u0131\u015fma ortam\u0131na en yak\u0131n \u015fekilde test eder.<br \/>\n*   <strong>G\u00fcvenilirlik:<\/strong> Zone.js sayesinde t\u00fcm asenkron i\u015flemlerin tamamland\u0131\u011f\u0131ndan emin olursunuz, bu da &#8220;flaky&#8221; testleri azalt\u0131r.<br \/>\n*   <strong>Karma\u015f\u0131k Senaryolar:<\/strong> <code>fakeAsync<\/code>&#8216;in ba\u015fa \u00e7\u0131kamad\u0131\u011f\u0131 (\u00f6rne\u011fin, Zone.js taraf\u0131ndan izlenmeyen d\u0131\u015f k\u00fct\u00fcphane asenkron i\u015flemleri) senaryolar i\u00e7in uygundur.<\/p>\n<p><strong>Dezavantajlar\u0131:<\/strong><br \/>\n*   <strong>Daha Yava\u015f Testler:<\/strong> Asenkron i\u015flemlerin ger\u00e7ek zamanl\u0131 olarak tamamlanmas\u0131n\u0131 bekledi\u011fi i\u00e7in testler daha uzun s\u00fcrebilir.<br \/>\n*   <strong>Hata Ay\u0131klama:<\/strong> Zaman gecikmeleri nedeniyle hata ay\u0131klama bazen daha zor olabilir.<\/p>\n<h3>fakeAsync Kullan\u0131m\u0131<\/h3>\n<p><code>fakeAsync<\/code>, Angular testlerinde zaman\u0131 manip\u00fcle etmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir test yard\u0131mc\u0131 arac\u0131d\u0131r. Asenkron kodun senkron bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flayarak testleri \u00e7ok daha h\u0131zl\u0131 ve deterministik hale getirir.<\/p>\n<h4>fakeAsync Nedir?<\/h4>\n<p><code>fakeAsync<\/code>, Zone.js&#8217;in bir par\u00e7as\u0131 olan <code>AsyncTestZone<\/code>&#8216;u kullanarak, test blo\u011fu i\u00e7indeki asenkron g\u00f6revleri (zamanlay\u0131c\u0131lar, Promise&#8217;ler, baz\u0131 Observable&#8217;lar) yakalar ve bunlar\u0131 ger\u00e7ek zaman\u0131 ilerletmeden, manuel olarak kontrol etmenizi sa\u011flar. Bu sayede, normalde milisaniyeler veya saniyeler s\u00fcrecek i\u015flemler an\u0131nda tamamlanabilir.<\/p>\n<h4>Ne Zaman fakeAsync Kullan\u0131l\u0131r?<\/h4>\n<p>*   <strong>Zamanlay\u0131c\u0131lar:<\/strong> <code>setTimeout<\/code>, <code>setInterval<\/code> gibi JavaScript zamanlay\u0131c\u0131lar\u0131n\u0131 i\u00e7eren kodlar\u0131 test ederken.<br \/>\n*   <strong>Promise&#8217;ler:<\/strong> <code>Promise.resolve()<\/code>, <code>Promise.reject()<\/code> veya <code>new Promise()<\/code> ile olu\u015fturulan Promise&#8217;leri test ederken.<br \/>\n*   <strong>Basit Observable&#8217;lar:<\/strong> RxJS&#8217;in <code>of()<\/code>, <code>from()<\/code>, <code>timer()<\/code>, <code>delay()<\/code> gibi operat\u00f6rleriyle olu\u015fturulan ve Zone.js taraf\u0131ndan kontrol edilebilen Observable&#8217;lar\u0131 test ederken.<br \/>\n*   <strong><code>debounceTime<\/code>, <code>throttleTime<\/code> gibi Zaman Tabanl\u0131 RxJS Operat\u00f6rleri:<\/strong> Bu operat\u00f6rlerin davran\u0131\u015f\u0131n\u0131 h\u0131zl\u0131ca test etmek i\u00e7in idealdir.<br \/>\n*   <strong>Senkron Hale Getirilmi\u015f Asenkron \u0130\u015flemler:<\/strong> Ger\u00e7ek HTTP istekleri yerine <code>HttpClientTestingModule<\/code> ile mock&#8217;lanm\u0131\u015f HTTP yan\u0131tlar\u0131n\u0131 i\u00e7eren senaryolarda da kullan\u0131labilir, ancak genellikle <code>waitForAsync<\/code> daha do\u011fal bir uyum sa\u011flar.<\/p>\n<p><strong>\u00d6nemli Not:<\/strong> <code>fakeAsync<\/code> i\u00e7inde ger\u00e7ek bir HTTP iste\u011fi yapmaya \u00e7al\u0131\u015f\u0131rsan\u0131z (yani <code>HttpClientTestingModule<\/code> kullanmadan), <code>XMLHttpRequest<\/code> veya <code>fetch<\/code> gibi taray\u0131c\u0131 API&#8217;leri Zone.js taraf\u0131ndan yakalanamad\u0131\u011f\u0131 i\u00e7in bir hata al\u0131rs\u0131n\u0131z. Bu nedenle, <code>fakeAsync<\/code> HTTP isteklerini <em>ger\u00e7ekten<\/em> yapmayan, mock&#8217;lanm\u0131\u015f senaryolar i\u00e7in daha uygundur.<\/p>\n<h4>fakeAsync Nas\u0131l Kullan\u0131l\u0131r?<\/h4>\n<p><code>fakeAsync<\/code>, <code>it()<\/code> blo\u011funun callback fonksiyonunu sarmalar. \u0130\u00e7erisinde <code>tick()<\/code> ve <code>flush()<\/code> ad\u0131nda iki yard\u0131mc\u0131 fonksiyon bulunur:<\/p>\n<p>*   <code>tick(millis?: number)<\/code>: Test ortam\u0131ndaki zaman\u0131 belirtilen milisaniye kadar ileri sarar. Bu, <code>setTimeout<\/code> veya <code>setInterval<\/code> gibi zamanlay\u0131c\u0131lar\u0131n tetiklenmesini sa\u011flar. Varsay\u0131lan olarak 0 milisaniye ilerletir.<br \/>\n*   <code>flush()<\/code>: T\u00fcm bekleyen mikro g\u00f6revleri (Promise&#8217;ler ve baz\u0131 Observable abonelikleri) an\u0131nda tamamlar. <code>tick(0)<\/code> ile benzerdir ancak Promise&#8217;ler i\u00e7in daha a\u00e7\u0131klay\u0131c\u0131d\u0131r.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rneklerde, <code>fakeAsync<\/code>&#8216;in farkl\u0131 asenkron senaryolarda nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 g\u00f6rece\u011fiz.<\/p>\n<h4>\u00d6rnek 1: setTimeout ile Zamanlay\u0131c\u0131 Testi<\/h4>\n<pre><code class=\"language-typescript\">import { Component, OnInit } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-timer',\r\n  template: <code>\r\n    <h2>Zamanlay\u0131c\u0131<\/h2>\r\n    <p>{{ message }}<\/p>\r\n  <\/code>,\r\n})\r\nexport class TimerComponent implements OnInit {\r\n  message: string = 'Bekleniyor...';\r\n\r\n  ngOnInit(): void {\r\n    setTimeout(() => {\r\n      this.message = 'Mesaj geldi!';\r\n    }, 1000); \/\/ 1 saniye sonra mesaj de\u011fi\u015fecek\r\n  }\r\n}<\/code><\/pre>\n<p>Test kodu:<\/p>\n<pre><code class=\"language-typescript\">import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular\/core\/testing';\r\nimport { TimerComponent } from '.\/timer.component';\r\nimport { NO_ERRORS_SCHEMA } from '@angular\/core';\r\n\r\ndescribe('TimerComponent with fakeAsync', () => {\r\n  let component: TimerComponent;\r\n  let fixture: ComponentFixture<TimerComponent>;\r\n\r\n  beforeEach(() => {\r\n    TestBed.configureTestingModule({\r\n      declarations: [TimerComponent],\r\n      schemas: [NO_ERRORS_SCHEMA]\r\n    }).compileComponents();\r\n\r\n    fixture = TestBed.createComponent(TimerComponent);\r\n    component = fixture.componentInstance;\r\n  });\r\n\r\n  it('1 saniye sonra mesaj\u0131 de\u011fi\u015ftirmeli', fakeAsync(() => {\r\n    fixture.detectChanges(); \/\/ ngOnInit'i tetikler, setTimeout ba\u015flar\r\n    expect(component.message).toBe('Bekleniyor...');\r\n\r\n    tick(500); \/\/ 500 milisaniye ilerlet, mesaj hen\u00fcz de\u011fi\u015fmemeli\r\n    fixture.detectChanges();\r\n    expect(component.message).toBe('Bekleniyor...');\r\n\r\n    tick(500); \/\/ 500 milisaniye daha ilerlet (toplam 1000ms), setTimeout tetiklenmeli\r\n    fixture.detectChanges(); \/\/ DOM'u g\u00fcncelle\r\n    expect(component.message).toBe('Mesaj geldi!');\r\n  }));\r\n\r\n  it('zamanlay\u0131c\u0131 tamamlanmadan \u00f6nce bile\u015fen yok edildi\u011finde mesaj\u0131 de\u011fi\u015ftirmemeli', fakeAsync(() => {\r\n    fixture.detectChanges();\r\n    expect(component.message).toBe('Bekleniyor...');\r\n\r\n    tick(500); \/\/ 500 milisaniye ilerlet\r\n    fixture.destroy(); \/\/ Bile\u015feni yok et\r\n    tick(500); \/\/ Kalan s\u00fcreyi ilerlet\r\n\r\n    \/\/ Bile\u015fen yok edildi\u011fi i\u00e7in message de\u011fi\u015fmemi\u015f olmal\u0131 (Angular'\u0131n lifecycle y\u00f6netimi)\r\n    \/\/ Not: Ger\u00e7ek bir senaryoda, setTimeout i\u00e7indeki i\u015flemin tamamlan\u0131p tamamlanmad\u0131\u011f\u0131n\u0131\r\n    \/\/ kontrol etmek i\u00e7in daha karma\u015f\u0131k bir mocklama gerekebilir.\r\n    \/\/ Bu \u00f6rnekte, bile\u015fen yok edildi\u011fi i\u00e7in setTimeout callback'i muhtemelen \u00e7al\u0131\u015fmaz.\r\n    \/\/ Ancak, e\u011fer callback \u00e7al\u0131\u015fsa bile, bu testte <code>message<\/code> \u00f6zelli\u011fi g\u00fcncellenmeyecektir\r\n    \/\/ \u00e7\u00fcnk\u00fc bile\u015fen zaten yok edilmi\u015ftir.\r\n    expect(component.message).toBe('Bekleniyor...');\r\n  }));\r\n});<\/code><\/pre>\n<h4>\u00d6rnek 2: Promise Testi<\/h4>\n<pre><code class=\"language-typescript\">import { Component, OnInit } from '@angular\/core';\r\n\r\n@Component({\r\n  selector: 'app-promise',\r\n  template: <code>\r\n    <h2>Promise \u00d6rne\u011fi<\/h2>\r\n    <p>{{ data }}<\/p>\r\n  <\/code>,\r\n})\r\nexport class PromiseComponent implements OnInit {\r\n  data: string = 'Y\u00fckleniyor...';\r\n\r\n  ngOnInit(): void {\r\n    this.fetchData().then((result) => {\r\n      this.data = result;\r\n    });\r\n  }\r\n\r\n  fetchData(): Promise<string> {\r\n    return Promise.resolve('Veri Promise ile geldi!');\r\n  }\r\n}<\/code><\/pre>\n<p>Test kodu:<\/p>\n<pre><code class=\"language-typescript\">import { ComponentFixture, TestBed, fakeAsync, flush } from '@angular\/core\/testing';\r\nimport { PromiseComponent } from '.\/promise.component';\r\nimport { NO_ERRORS_SCHEMA } from '@angular\/core';\r\n\r\ndescribe('PromiseComponent with fakeAsync', () => {\r\n  let component: PromiseComponent;\r\n  let fixture: ComponentFixture<PromiseComponent>;\r\n\r\n  beforeEach(() => {\r\n    TestBed.configureTestingModule({\r\n      declarations: [PromiseComponent],\r\n      schemas: [NO_ERRORS_SCHEMA]\r\n    }).compileComponents();\r\n\r\n    fixture = TestBed.createComponent(PromiseComponent);\r\n    component = fixture.componentInstance;\r\n  });\r\n\r\n  it('Promise \u00e7\u00f6z\u00fcmlendi\u011finde veriyi g\u00f6stermeli', fakeAsync(() => {\r\n    fixture.detectChanges(); \/\/ ngOnInit'i tetikler, Promise ba\u015flar\r\n    expect(component.data).toBe('Y\u00fckleniyor...');\r\n\r\n    flush(); \/\/ T\u00fcm bekleyen Promise'leri an\u0131nda tamamlar (mikro g\u00f6revler)\r\n    fixture.detectChanges(); \/\/ DOM'u g\u00fcncelle\r\n    expect(component.data).toBe('Veri Promise ile geldi!');\r\n  }));\r\n});<\/code><\/pre>\n<h4>\u00d6rnek 3: Observable (delay operat\u00f6r\u00fc ile) Testi<\/h4>\n<pre><code class=\"language-typescript\">import { Component, OnInit } from '@angular\/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { delay } from 'rxjs\/operators';\r\n\r\n@Component({\r\n  selector: 'app-observable',\r\n  template: <code>\r\n    <h2>Observable \u00d6rne\u011fi<\/h2>\r\n    <p>{{ value }}<\/p>\r\n  <\/code>,\r\n})\r\nexport class ObservableComponent implements OnInit {\r\n  value: string = 'Bekleniyor...';\r\n\r\n  ngOnInit(): void {\r\n    this.getDelayedValue().subscribe((val) => {\r\n      this.value = val;\r\n    });\r\n  }\r\n\r\n  getDelayedValue(): Observable<string> {\r\n    return of('Observable verisi geldi!').pipe(delay(2000)); \/\/ 2 saniye gecikme\r\n  }\r\n}<\/code><\/pre>\n<p>Test kodu:<\/p>\n<pre><code class=\"language-typescript\">import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular\/core\/testing';\r\nimport { ObservableComponent } from '.\/observable.component';\r\nimport { NO_ERRORS_SCHEMA } from '@angular\/core';\r\n\r\ndescribe('ObservableComponent with fakeAsync', () => {\r\n  let component: ObservableComponent;\r\n  let fixture: ComponentFixture<ObservableComponent>;\r\n\r\n  beforeEach(() => {\r\n    TestBed.configureTestingModule({\r\n      declarations: [ObservableComponent],\r\n      schemas: [NO_ERRORS_SCHEMA]\r\n    }).compileComponents();\r\n\r\n    fixture = TestBed.createComponent(ObservableComponent);\r\n    component = fixture.componentInstance;\r\n  });\r\n\r\n  it('Observable gecikme sonras\u0131 de\u011feri g\u00fcncellemelidir', fakeAsync(() => {\r\n    fixture.detectChanges(); \/\/ ngOnInit'i tetikler, Observable aboneli\u011fi ba\u015flar\r\n    expect(component.value).toBe('Bekleniyor...');\r\n\r\n    tick(1999); \/\/ 1999 milisaniye ilerlet, hen\u00fcz de\u011fer gelmemi\u015f olmal\u0131\r\n    fixture.detectChanges();\r\n    expect(component.value).toBe('Bekleniyor...');\r\n\r\n    tick(1); \/\/ 1 milisaniye daha ilerlet (toplam 2000ms), Observable de\u011feri yaymal\u0131\r\n    fixture.detectChanges(); \/\/ DOM'u g\u00fcncelle\r\n    expect(component.value).toBe('Observable verisi geldi!');\r\n  }));\r\n});<\/code><\/pre>\n<h4>fakeAsync Avantajlar\u0131 ve Dezavantajlar\u0131<\/h4>\n<p><strong>Avantajlar\u0131:<\/strong><br \/>\n*   <strong>H\u0131zl\u0131 Testler:<\/strong> Asenkron i\u015flemlerin ger\u00e7ek zamanl\u0131 tamamlanmas\u0131n\u0131 beklemedi\u011fi i\u00e7in testler \u00e7ok h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>Deterministik:<\/strong> Zaman\u0131 manuel olarak kontrol etti\u011finiz i\u00e7in test sonu\u00e7lar\u0131 her zaman ayn\u0131d\u0131r.<br \/>\n*   <strong>Kolay Hata Ay\u0131klama:<\/strong> Zaman gecikmeleri ortadan kalkt\u0131\u011f\u0131 i\u00e7in hata ay\u0131klama daha kolayd\u0131r.<br \/>\n*   <strong>Okunabilirlik:<\/strong> <code>async\/await<\/code> benzeri senkron bir ak\u0131\u015f sa\u011flar.<\/p>\n<p><strong>Dezavantajlar\u0131:<\/strong><br \/>\n*   <strong>K\u0131s\u0131tlamalar:<\/strong> Zone.js taraf\u0131ndan yakalanamayan (\u00f6rne\u011fin, ger\u00e7ek HTTP istekleri, Web Workers) asenkron i\u015flemleri test edemez. Bu durumlarda bir hata f\u0131rlat\u0131r.<br \/>\n*   <strong>Ger\u00e7ek\u00e7ilik Eksikli\u011fi:<\/strong> Zaman\u0131 manip\u00fcle etti\u011fi i\u00e7in ger\u00e7ek \u00e7al\u0131\u015fma ortam\u0131n\u0131n baz\u0131 n\u00fcanslar\u0131n\u0131 yans\u0131tmayabilir.<br \/>\n*   <strong><code>tick()<\/code> ve <code>flush()<\/code> Y\u00f6netimi:<\/strong> Karma\u015f\u0131k asenkron ak\u0131\u015flarda <code>tick()<\/code> ve <code>flush()<\/code>&#8216;\u0131 do\u011fru yerlerde kullanmak bazen zor olabilir.<\/p>\n<h3>waitForAsync ve fakeAsync Kar\u015f\u0131la\u015ft\u0131rmas\u0131 ve Ne Zaman Hangisini Se\u00e7meli?<\/h3>\n<p>| \u00d6zellik           | <code>waitForAsync<\/code>                                      | <code>fakeAsync<\/code>                                               |<br \/>\n| :&#8212;&#8212;&#8212;&#8212;&#8212;- | :&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; | :&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; |<br \/>\n| <strong>\u00c7al\u0131\u015fma Prensibi<\/strong> | Zone.js ile ger\u00e7ek asenkron g\u00f6revlerin tamamlanmas\u0131n\u0131 bekler. | Zone.js ile asenkron g\u00f6revleri yakalar ve zaman\u0131 manuel manip\u00fcle eder. |<br \/>\n| <strong>Test H\u0131z\u0131<\/strong>     | Daha yava\u015f (ger\u00e7ek zaman gecikmeleri nedeniyle).    | \u00c7ok h\u0131zl\u0131 (zaman\u0131 atlayarak).                            |<br \/>\n| <strong>Ger\u00e7ek\u00e7ilik<\/strong>   | Y\u00fcksek (ger\u00e7ek \u00e7al\u0131\u015fma ortam\u0131na yak\u0131n).            | D\u00fc\u015f\u00fck (zaman manip\u00fclasyonu nedeniyle).                    |<br \/>\n| <strong>Kullan\u0131m Alan\u0131<\/strong> | Ger\u00e7ek HTTP istekleri, karma\u015f\u0131k RxJS ak\u0131\u015flar\u0131, d\u0131\u015f k\u00fct\u00fcphanelerin asenkron i\u015flemleri. | <code>setTimeout<\/code>, <code>setInterval<\/code>, Promise&#8217;ler, <code>delay<\/code>, <code>debounceTime<\/code> gibi RxJS operat\u00f6rleri. |<br \/>\n| <strong>Hata Yakalama<\/strong> | Ger\u00e7ek asenkron hatalar\u0131 yakalar.                   | <code>Zone.js<\/code> taraf\u0131ndan yakalanamayan asenkron i\u015flemlerde hata verir. |<br \/>\n| <strong>Yard\u0131mc\u0131 Fonksiyonlar<\/strong> | <code>fixture.whenStable()<\/code>, <code>async\/await<\/code>           | <code>tick()<\/code>, <code>flush()<\/code>                                       |<\/p>\n<p><strong>Genel Kural:<\/strong><\/p>\n<p>*   <strong><code>fakeAsync<\/code>&#8216;i tercih edin:<\/strong> M\u00fcmk\u00fcn oldu\u011funca <code>fakeAsync<\/code> kullanmaya \u00e7al\u0131\u015f\u0131n. Testlerinizin daha h\u0131zl\u0131 ve deterministik olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle zamanlay\u0131c\u0131lar, Promise&#8217;ler ve basit Observable&#8217;lar i\u00e7in harikad\u0131r.<br \/>\n*   <strong><code>waitForAsync<\/code>&#8216;e ba\u015fvurun:<\/strong> <code>fakeAsync<\/code>&#8216;in k\u0131s\u0131tlamalar\u0131na tak\u0131ld\u0131\u011f\u0131n\u0131zda veya ger\u00e7ek HTTP istekleri gibi Zone.js&#8217;in kontrol edemedi\u011fi d\u0131\u015f asenkron i\u015flemleri test etmeniz gerekti\u011finde <code>waitForAsync<\/code> kullan\u0131n. <code>HttpClientTestingModule<\/code> ile HTTP isteklerini mock&#8217;lasan\u0131z bile, <code>delay<\/code> gibi operat\u00f6rler kullan\u0131yorsan\u0131z <code>waitForAsync<\/code> ve <code>fixture.whenStable()<\/code> kombinasyonu daha g\u00fcvenli bir se\u00e7im olabilir.<\/p>\n<p><strong>\u00d6nemli Uyar\u0131:<\/strong> Ayn\u0131 <code>it<\/code> blo\u011fu i\u00e7inde <code>waitForAsync<\/code> ve <code>fakeAsync<\/code>&#8216;i birlikte kullanmaya \u00e7al\u0131\u015fmay\u0131n. Bu, \u00f6ng\u00f6r\u00fclemeyen davran\u0131\u015flara ve hatalara yol a\u00e7acakt\u0131r. Her test blo\u011fu i\u00e7in tek bir asenkron test stratejisi se\u00e7melisiniz.<\/p>\n<h3>En \u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>1.  <strong><code>detectChanges()<\/code>&#8216;\u0131 Unutmay\u0131n:<\/strong> Angular, DOM&#8217;u otomatik olarak g\u00fcncellemez. Asenkron bir i\u015flem tamamland\u0131ktan sonra bile\u015fenin \u015fablonunun g\u00fcncellenmesi gerekiyorsa, <code>fixture.detectChanges()<\/code>&#8216;\u0131 tekrar \u00e7a\u011f\u0131rmay\u0131 unutmay\u0131n.<br \/>\n2.  <strong><code>TestBed.inject()<\/code> Kullan\u0131n:<\/strong> Servisleri veya di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\u0131 testlerde almak i\u00e7in <code>TestBed.get()<\/code> yerine <code>TestBed.inject()<\/code> kullan\u0131n. <code>TestBed.get()<\/code> eski bir y\u00f6ntemdir ve gelecekte kald\u0131r\u0131labilir.<br \/>\n3.  <strong>Temizleme \u0130\u015flemleri (<code>afterEach<\/code>):<\/strong> \u00d6zellikle mock HTTP istekleri kullan\u0131rken, <code>httpTestingController.verify()<\/code>&#8216;yi <code>afterEach<\/code> blo\u011funda \u00e7a\u011f\u0131rarak bekleyen veya yanl\u0131\u015fl\u0131kla yap\u0131lan HTTP isteklerinin olmad\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. Bu, testlerinizin izole kalmas\u0131na yard\u0131mc\u0131 olur.<br \/>\n4.  <strong>Abonelikleri Y\u00f6netin:<\/strong> Bile\u015fenlerinizde Observable&#8217;lara abone oluyorsan\u0131z, haf\u0131za s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in <code>ngOnDestroy<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131nda abonelikleri iptal etti\u011finizden emin olun (<code>.unsubscribe()<\/code>). Testlerinizde de bu senaryoyu kontrol etmek isteyebilirsiniz.<br \/>\n5.  <strong>Testleri Odaklay\u0131n:<\/strong> Her testin tek bir \u015feyi test etmesini sa\u011flay\u0131n. Karma\u015f\u0131k asenkron ak\u0131\u015flar\u0131 k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara ay\u0131r\u0131n.<br \/>\n6.  <strong>Hata Senaryolar\u0131n\u0131 Test Edin:<\/strong> Ba\u015far\u0131l\u0131 asenkron i\u015flemler kadar, hata durumlar\u0131n\u0131 da test edin. \u00d6rne\u011fin, bir HTTP iste\u011finin ba\u015far\u0131s\u0131z olmas\u0131 durumunda bile\u015fenin nas\u0131l davrand\u0131\u011f\u0131n\u0131 kontrol edin.<br \/>\n7.  <strong><code>async\/await<\/code> ile <code>waitForAsync<\/code>:<\/strong> <code>waitForAsync<\/code> ile <code>async\/await<\/code> kullanmak, Promise tabanl\u0131 veya Observable tabanl\u0131 asenkron kodunuzu daha okunabilir ve y\u00f6netilebilir hale getirir. <code>await fixture.whenStable()<\/code> kilit noktad\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p><code>waitForAsync<\/code> ve <code>fakeAsync<\/code>, Angular geli\u015ftiricilerinin asenkron kodlar\u0131n\u0131 g\u00fcvenilir ve verimli bir \u015fekilde test etmeleri i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r. <code>fakeAsync<\/code>, zamanlay\u0131c\u0131lar ve Promise&#8217;ler gibi i\u00e7 asenkronluklar\u0131 h\u0131zl\u0131 ve deterministik bir \u015fekilde test etmek i\u00e7in m\u00fckemmeldir. <code>waitForAsync<\/code> ise ger\u00e7ek HTTP istekleri ve Zone.js taraf\u0131ndan izlenen karma\u015f\u0131k asenkron ak\u0131\u015flar i\u00e7in daha ger\u00e7ek\u00e7i bir test ortam\u0131 sunar.<\/p>\n<p>Her iki arac\u0131n da kendine \u00f6zg\u00fc avantajlar\u0131 ve k\u0131s\u0131tlamalar\u0131 vard\u0131r. Bu nedenle, test etti\u011finiz asenkron i\u015flemin do\u011fas\u0131na g\u00f6re do\u011fru arac\u0131 se\u00e7mek, Angular testlerinizin kalitesini, h\u0131z\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131rman\u0131n anahtar\u0131d\u0131r. Bu makaledeki \u00f6rnekler ve a\u00e7\u0131klamalar, Angular test stratejinizde <code>waitForAsync<\/code> ve <code>fakeAsync<\/code>&#8216;i ustaca kullanman\u0131z i\u00e7in sa\u011flam bir temel sa\u011flam\u0131\u015ft\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131\nAngular uygulamalar\u0131, modern web geli\u015ftirmenin temel ta\u015f","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1488],"tags":[],"class_list":{"0":"post-30325","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131  Angular uygulamalar\u0131, modern web geli\u015ftirmenin temel ta\u015f\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-26T14:14:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-26T14:27:31+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131\",\"datePublished\":\"2025-09-26T14:14:03+00:00\",\"dateModified\":\"2025-09-26T14:27:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\"},\"wordCount\":1855,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\",\"name\":\"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-09-26T14:14:03+00:00\",\"dateModified\":\"2025-09-26T14:27:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131","og_description":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131  Angular uygulamalar\u0131, modern web geli\u015ftirmenin temel ta\u015f","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-09-26T14:14:03+00:00","article_modified_time":"2025-09-26T14:27:31+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131","datePublished":"2025-09-26T14:14:03+00:00","dateModified":"2025-09-26T14:27:31+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/"},"wordCount":1855,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/","name":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-09-26T14:14:03+00:00","dateModified":"2025-09-26T14:27:31+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-testlerinde-asenkron-islemleri-yonetmek-waitforasync-ve-fakeasync-kullanimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular Testlerinde Asenkron \u0130\u015flemleri Y\u00f6netmek: waitForAsync ve fakeAsync Kullan\u0131m\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=30325"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30325\/revisions"}],"predecessor-version":[{"id":30329,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30325\/revisions\/30329"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}