{"id":31802,"date":"2025-10-14T05:40:41","date_gmt":"2025-10-14T02:40:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31802"},"modified":"2025-10-14T05:40:41","modified_gmt":"2025-10-14T02:40:41","slug":"react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/","title":{"rendered":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek"},"content":{"rendered":"<p><body><\/p>\n<h2>React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek<\/h2>\n<p>Redux, React uygulamalar\u0131nda durum y\u00f6netimini merkezi ve \u00f6ng\u00f6r\u00fclebilir bir \u015fekilde ele almak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, Redux mimarisinin her bir par\u00e7as\u0131n\u0131n (aksiyonlar, reducer&#8217;lar, bile\u015fenler) bekledi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak kritik hale gelir. Bu serinin ilk b\u00f6l\u00fcm\u00fcnde React bile\u015fenlerini Jest ve Enzyme ile test etmeyi, ikinci b\u00f6l\u00fcm\u00fcnde ise Redux reducer&#8217;lar\u0131n\u0131 test etmeyi ele ald\u0131k. \u015eimdi s\u0131ra, Redux ekosisteminin \u00f6nemli bir par\u00e7as\u0131 olan aksiyonlar\u0131 test etmeye geldi.<\/p>\n<p>Aksiyonlar, Redux uygulaman\u0131z\u0131n durumunda meydana gelen de\u011fi\u015fiklikleri a\u00e7\u0131klayan sade JavaScript nesneleridir. Bir aksiyon, uygulaman\u0131zda ne oldu\u011funu belirtir, ancak durumun nas\u0131l de\u011fi\u015fece\u011fini a\u00e7\u0131klamaz; bu reducer&#8217;lar\u0131n g\u00f6revidir. Aksiyonlar, genellikle aksiyon yarat\u0131c\u0131lar\u0131 (action creators) ad\u0131 verilen fonksiyonlar arac\u0131l\u0131\u011f\u0131yla olu\u015fturulur. \u00d6zellikle asenkron aksiyonlar, API \u00e7a\u011fr\u0131lar\u0131 gibi yan etkileri y\u00f6netti\u011fi ve birden fazla aksiyonu s\u0131rayla g\u00f6nderdi\u011fi i\u00e7in test edilmesi gereken karma\u015f\u0131k mant\u0131k i\u00e7erebilir.<\/p>\n<p>Aksiyonlar\u0131 test etmek, uygulaman\u0131z\u0131n temel i\u015f mant\u0131\u011f\u0131n\u0131n ve d\u0131\u015f servislerle (API&#8217;ler gibi) etkile\u015fimlerinin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olman\u0131z\u0131 sa\u011flar. Bu b\u00f6l\u00fcmde, Jest&#8217;i ana test \u00e7er\u00e7evesi olarak kullanarak Redux aksiyonlar\u0131n\u0131 nas\u0131l test edece\u011fimizi derinlemesine inceleyece\u011fiz. Enzyme, bile\u015fen testleri i\u00e7in harika olsa da, aksiyon testleri i\u00e7in daha \u00e7ok <code>redux-mock-store<\/code> ve HTTP isteklerini taklit etmek i\u00e7in <code>axios-mock-adapter<\/code> veya <code>nock<\/code> gibi k\u00fct\u00fcphanelere ihtiyac\u0131m\u0131z olacak.<\/p>\n<h3>Redux Aksiyonlar\u0131n\u0131 Anlamak<\/h3>\n<p>Testlere ge\u00e7meden \u00f6nce Redux aksiyonlar\u0131n\u0131n yap\u0131s\u0131n\u0131 k\u0131saca hat\u0131rlayal\u0131m:<\/p>\n<p>*   <strong>Senkron Aksiyonlar:<\/strong> Bunlar, hemen bir aksiyon nesnesi d\u00f6nd\u00fcren basit fonksiyonlard\u0131r. \u00d6rne\u011fin, bir todo listesine \u00f6\u011fe ekleme veya bir filtrenin de\u011ferini de\u011fi\u015ftirme gibi durum de\u011fi\u015fikliklerini tetiklerler. Bu aksiyonlar genellikle herhangi bir yan etki (side effect) i\u00e7ermez.<br \/>\n*   <strong>Asenkron Aksiyonlar (Thunk&#8217;lar):<\/strong> Redux Thunk gibi ara yaz\u0131l\u0131mlar (middleware) kullan\u0131ld\u0131\u011f\u0131nda, aksiyon yarat\u0131c\u0131lar\u0131 sadece bir nesne d\u00f6nd\u00fcrmek yerine bir fonksiyon d\u00f6nd\u00fcrebilirler. Bu fonksiyonlar genellikle <code>dispatch<\/code> ve <code>getState<\/code> arg\u00fcmanlar\u0131n\u0131 al\u0131r ve API \u00e7a\u011fr\u0131lar\u0131, zamanlay\u0131c\u0131lar veya di\u011fer yan etkileri y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Yan etki tamamland\u0131\u011f\u0131nda veya ba\u015far\u0131s\u0131z oldu\u011funda, bir veya daha fazla senkron aksiyonu <code>dispatch<\/code> ederler.<\/p>\n<p>Bu b\u00f6l\u00fcmde, her iki t\u00fcr aksiyon yarat\u0131c\u0131s\u0131n\u0131 da nas\u0131l test edece\u011fimizi g\u00f6sterece\u011fiz.<\/p>\n<h3>Redux Aksiyon Testleri \u0130\u00e7in Kurulum<\/h3>\n<p>Aksiyonlar\u0131 test etmek i\u00e7in a\u015fa\u011f\u0131daki ara\u00e7lara ihtiyac\u0131m\u0131z olacak:<\/p>\n<p>*   <strong>Jest:<\/strong> JavaScript test \u00e7er\u00e7evesi. Projenizde zaten kurulu olmal\u0131.<br \/>\n*   <strong><code>redux-mock-store<\/code>:<\/strong> Redux store&#8217;u taklit etmek i\u00e7in kullan\u0131l\u0131r. Asenkron aksiyonlar\u0131n <code>dispatch<\/code> etti\u011fi t\u00fcm aksiyonlar\u0131 kaydeder, b\u00f6ylece bunlar\u0131 do\u011frulayabiliriz.<br \/>\n*   <strong><code>redux-thunk<\/code>:<\/strong> Asenkron aksiyonlar i\u00e7in Redux Thunk kullan\u0131yorsan\u0131z, test ortam\u0131nda da bu middleware&#8217;e ihtiyac\u0131m\u0131z olacak.<br \/>\n*   <strong><code>axios<\/code> (veya benzeri bir HTTP istemcisi):<\/strong> API \u00e7a\u011fr\u0131lar\u0131 i\u00e7in kullan\u0131l\u0131yorsa.<br \/>\n*   <strong><code>axios-mock-adapter<\/code> (veya <code>nock<\/code>):<\/strong> HTTP isteklerini taklit etmek i\u00e7in. Bu, testlerimizin ger\u00e7ek API&#8217;lere ba\u011f\u0131ml\u0131 olmamas\u0131n\u0131 ve daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Kurulum komutlar\u0131:<\/p>\n<pre><code class=\"language-bash\">npm install --save-dev redux-mock-store redux-thunk axios-mock-adapter axios\n<h2>veya yarn<\/h2>\nyarn add --dev redux-mock-store redux-thunk axios-mock-adapter axios<\/code><\/pre>\n<p>Proje yap\u0131s\u0131 genellikle <code>src\/actions<\/code> klas\u00f6r\u00fcnde aksiyon dosyalar\u0131n\u0131 ve <code>src\/__tests__\/actions<\/code> i\u00e7inde ilgili test dosyalar\u0131n\u0131 i\u00e7erir.<\/p>\n<h3>Senkron Aksiyon Yarat\u0131c\u0131lar\u0131n\u0131 Test Etmek<\/h3>\n<p>Senkron aksiyon yarat\u0131c\u0131lar\u0131 en basitidir. Sadece belirli bir t\u00fcrde ve y\u00fckte (payload) bir aksiyon nesnesi d\u00f6nd\u00fcrd\u00fcklerinden emin olmam\u0131z gerekir.<\/p>\n<h4>\u00d6rnek Senkron Aksiyon<\/h4>\n<p>Bir <code>todos<\/code> uygulamas\u0131 i\u00e7in yeni bir todo ekleyen bir aksiyon yarat\u0131c\u0131s\u0131 d\u00fc\u015f\u00fcnelim:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/actions\/todoActions.js\nlet nextTodoId = 0; \/\/ Basit bir ID y\u00f6netimi\n\nexport const addTodo = (text) => ({\n  type: 'ADD_TODO',\n  payload: {\n    id: nextTodoId++,\n    text,\n  },\n});\n\nexport const setVisibilityFilter = (filter) => ({\n  type: 'SET_VISIBILITY_FILTER',\n  payload: {\n    filter,\n  },\n});<\/code><\/pre>\n<h4>Senkron Aksiyon Testi<\/h4>\n<p>Bu aksiyon yarat\u0131c\u0131lar\u0131n\u0131 test etmek olduk\u00e7a basittir. Fonksiyonu \u00e7a\u011f\u0131r\u0131r\u0131z ve d\u00f6nd\u00fcrd\u00fc\u011f\u00fc nesnenin beklenen <code>type<\/code> ve <code>payload<\/code> de\u011ferlerine sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol ederiz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/__tests__\/actions\/todoActions.test.js\nimport { addTodo, setVisibilityFilter } from '..\/..\/actions\/todoActions';\n\ndescribe('Senkron Aksiyon Yarat\u0131c\u0131lar\u0131', () => {\n  it('addTodo, beklenen ADD_TODO aksiyonunu olu\u015fturmal\u0131', () => {\n    const text = 'Redux \u00f6\u011fren';\n    const expectedAction = {\n      type: 'ADD_TODO',\n      payload: {\n        id: expect.any(Number), \/\/ ID'nin bir say\u0131 olmas\u0131n\u0131 bekliyoruz\n        text,\n      },\n    };\n    \/\/ ID'nin artan bir de\u011fer oldu\u011funu varsayarsak, her testte farkl\u0131 olabilir.\n    \/\/ Bu y\u00fczden 'expect.any(Number)' kullanmak daha g\u00fcvenli.\n    \/\/ Veya ID \u00fcretme mant\u0131\u011f\u0131n\u0131 mock'layabiliriz.\n    expect(addTodo(text)).toEqual(expectedAction);\n  });\n\n  it('setVisibilityFilter, beklenen SET_VISIBILITY_FILTER aksiyonunu olu\u015fturmal\u0131', () => {\n    const filter = 'SHOW_COMPLETED';\n    const expectedAction = {\n      type: 'SET_VISIBILITY_FILTER',\n      payload: {\n        filter,\n      },\n    };\n    expect(setVisibilityFilter(filter)).toEqual(expectedAction);\n  });\n});<\/code><\/pre>\n<p>Burada <code>expect.any(Number)<\/code> kullanmak, <code>id<\/code>&#8216;nin tam de\u011ferini bilmemiz gerekmedi\u011finde veya her \u00e7a\u011fr\u0131da de\u011fi\u015febilece\u011fi durumlarda faydal\u0131d\u0131r. E\u011fer <code>id<\/code>&#8216;nin belirli bir de\u011fer olmas\u0131n\u0131 bekliyorsak, <code>nextTodoId<\/code>&#8216;yi testten \u00f6nce s\u0131f\u0131rlayabilir veya taklit edebiliriz.<\/p>\n<h3>Asenkron Aksiyon Yarat\u0131c\u0131lar\u0131n\u0131 Test Etmek (Redux Thunk)<\/h3>\n<p>Asenkron aksiyonlar, genellikle API \u00e7a\u011fr\u0131lar\u0131 veya di\u011fer yan etkileri i\u00e7erdi\u011finden daha karma\u015f\u0131kt\u0131r. Bu t\u00fcr aksiyonlar birden fazla senkron aksiyonu <code>dispatch<\/code> edebilir (\u00f6rne\u011fin, bir iste\u011fin ba\u015flad\u0131\u011f\u0131n\u0131, ba\u015far\u0131l\u0131 oldu\u011funu veya ba\u015far\u0131s\u0131z oldu\u011funu belirten aksiyonlar). <code>redux-mock-store<\/code> ve HTTP taklit k\u00fct\u00fcphaneleri burada devreye girer.<\/p>\n<h4>\u00d6rnek Asenkron Aksiyon (API \u00c7a\u011fr\u0131s\u0131)<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131 bir API&#8217;den \u00e7eken bir asenkron aksiyon d\u00fc\u015f\u00fcnelim:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/actions\/userActions.js\nimport axios from 'axios';\n\n\/\/ Senkron aksiyon yarat\u0131c\u0131lar\u0131\nexport const fetchUsersRequest = () => ({\n  type: 'FETCH_USERS_REQUEST',\n});\n\nexport const fetchUsersSuccess = (users) => ({\n  type: 'FETCH_USERS_SUCCESS',\n  payload: users,\n});\n\nexport const fetchUsersFailure = (error) => ({\n  type: 'FETCH_USERS_FAILURE',\n  payload: error,\n});\n\n\/\/ Asenkron aksiyon yarat\u0131c\u0131s\u0131 (Thunk)\nexport const fetchUsers = () => async (dispatch) => {\n  dispatch(fetchUsersRequest()); \/\/ \u0130stek ba\u015flad\u0131 aksiyonunu g\u00f6nder\n\n  try {\n    const response = await axios.get('\/api\/users');\n    dispatch(fetchUsersSuccess(response.data)); \/\/ Ba\u015far\u0131l\u0131 aksiyonu g\u00f6nder\n  } catch (error) {\n    dispatch(fetchUsersFailure(error.message)); \/\/ Hata aksiyonunu g\u00f6nder\n  }\n};<\/code><\/pre>\n<h4>Asenkron Aksiyon Testi \u0130\u00e7in Kurulum<\/h4>\n<p><code>redux-mock-store<\/code>&#8216;u <code>redux-thunk<\/code> middleware&#8217;i ile yap\u0131land\u0131rmam\u0131z gerekiyor:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/__tests__\/actions\/userActions.test.js\nimport configureMockStore from 'redux-mock-store';\nimport thunk from 'redux-thunk';\nimport axios from 'axios';\nimport MockAdapter from 'axios-mock-adapter'; \/\/ Axios isteklerini taklit etmek i\u00e7in\n\nimport {\n  fetchUsers,\n  fetchUsersRequest,\n  fetchUsersSuccess,\n  fetchUsersFailure,\n} from '..\/..\/actions\/userActions';\n\n\/\/ Redux Thunk middleware'ini mock store'a ekliyoruz\nconst middlewares = [thunk];\nconst mockStore = configureMockStore(middlewares);\n\n\/\/ Axios'u taklit etmek i\u00e7in bir adapt\u00f6r olu\u015fturuyoruz\nconst mockAxios = new MockAdapter(axios);\n\ndescribe('Asenkron Aksiyon Yarat\u0131c\u0131lar\u0131 (Thunks)', () => {\n  \/\/ Her testten sonra mock'u temizle\n  afterEach(() => {\n    mockAxios.reset();\n  });\n\n  \/\/ ... testlerimiz buraya gelecek\n});<\/code><\/pre>\n<h4>Ba\u015far\u0131l\u0131 API \u00c7a\u011fr\u0131s\u0131 Durumunu Test Etmek<\/h4>\n<p>API \u00e7a\u011fr\u0131s\u0131 ba\u015far\u0131l\u0131 oldu\u011funda <code>FETCH_USERS_REQUEST<\/code> ve ard\u0131ndan <code>FETCH_USERS_SUCCESS<\/code> aksiyonlar\u0131n\u0131n g\u00f6nderildi\u011fini do\u011frulamal\u0131y\u0131z.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/__tests__\/actions\/userActions.test.js (devam\u0131)\n  it('kullan\u0131c\u0131lar ba\u015far\u0131yla \u00e7ekildi\u011finde FETCH_USERS_SUCCESS aksiyonunu g\u00f6ndermeli', async () => {\n    const users = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];\n    \/\/ Axios'un \/api\/users adresine yap\u0131lan GET iste\u011fine 200 durum kodu ve kullan\u0131c\u0131 verileriyle yan\u0131t vermesini taklit et\n    mockAxios.onGet('\/api\/users').reply(200, users);\n\n    const expectedActions = [\n      fetchUsersRequest(), \/\/ \u0130lk olarak istek ba\u015flad\u0131 aksiyonu\n      fetchUsersSuccess(users), \/\/ Ard\u0131ndan ba\u015far\u0131l\u0131 aksiyonu\n    ];\n\n    \/\/ Bo\u015f bir ba\u015flang\u0131\u00e7 durumu ile mock store olu\u015ftur\n    const store = mockStore({});\n\n    \/\/ Asenkron aksiyonu dispatch et ve tamamlanmas\u0131n\u0131 bekle\n    await store.dispatch(fetchUsers());\n\n    \/\/ Store taraf\u0131ndan g\u00f6nderilen aksiyonlar\u0131n beklenen aksiyonlarla e\u015fle\u015fti\u011fini do\u011frula\n    expect(store.getActions()).toEqual(expectedActions);\n  });<\/code><\/pre>\n<p>Burada <code>mockAxios.onGet('\/api\/users').reply(200, users);<\/code> ile <code>\/api\/users<\/code> adresine yap\u0131lan bir GET iste\u011finin ba\u015far\u0131l\u0131 bir yan\u0131t d\u00f6nd\u00fcrece\u011fini belirtiyoruz. <code>store.dispatch(fetchUsers())<\/code> \u00e7a\u011fr\u0131ld\u0131ktan sonra, <code>store.getActions()<\/code> metodu, <code>dispatch<\/code> edilen t\u00fcm aksiyonlar\u0131n bir listesini d\u00f6nd\u00fcr\u00fcr. Bu listeyi beklenen aksiyon dizisiyle kar\u015f\u0131la\u015ft\u0131r\u0131r\u0131z.<\/p>\n<h4>Ba\u015far\u0131s\u0131z API \u00c7a\u011fr\u0131s\u0131 Durumunu Test Etmek<\/h4>\n<p>API \u00e7a\u011fr\u0131s\u0131 ba\u015far\u0131s\u0131z oldu\u011funda <code>FETCH_USERS_REQUEST<\/code> ve ard\u0131ndan <code>FETCH_USERS_FAILURE<\/code> aksiyonlar\u0131n\u0131n g\u00f6nderildi\u011fini do\u011frulamal\u0131y\u0131z.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/__tests__\/actions\/userActions.test.js (devam\u0131)\n  it('kullan\u0131c\u0131 \u00e7ekme ba\u015far\u0131s\u0131z oldu\u011funda FETCH_USERS_FAILURE aksiyonunu g\u00f6ndermeli', async () => {\n    const errorMessage = 'Network Error';\n    \/\/ Axios'un \/api\/users adresine yap\u0131lan GET iste\u011fine 500 durum kodu ve hata mesaj\u0131yla yan\u0131t vermesini taklit et\n    mockAxios.onGet('\/api\/users').reply(500, errorMessage);\n\n    const expectedActions = [\n      fetchUsersRequest(), \/\/ \u0130stek ba\u015flad\u0131 aksiyonu\n      fetchUsersFailure(errorMessage), \/\/ Hata aksiyonu\n    ];\n\n    const store = mockStore({});\n\n    await store.dispatch(fetchUsers());\n\n    expect(store.getActions()).toEqual(expectedActions);\n  });<\/code><\/pre>\n<p>Bu test, <code>mockAxios.onGet('\/api\/users').reply(500, errorMessage);<\/code> ile API&#8217;nin bir hata d\u00f6nd\u00fcrece\u011fini sim\u00fcle eder ve <code>fetchUsersFailure<\/code> aksiyonunun do\u011fru hata mesaj\u0131yla <code>dispatch<\/code> edildi\u011fini do\u011frular.<\/p>\n<h3><code>getState<\/code> Kullan\u0131lan Aksiyonlar\u0131 Test Etmek<\/h3>\n<p>Baz\u0131 asenkron aksiyonlar, mevcut Redux durumuna eri\u015fmek i\u00e7in <code>getState<\/code> arg\u00fcman\u0131n\u0131 kullan\u0131r. \u00d6rne\u011fin, bir verinin zaten y\u00fcklenip y\u00fcklenmedi\u011fini kontrol edebilir ve yaln\u0131zca gerekliyse bir API \u00e7a\u011fr\u0131s\u0131 yapabilirler.<\/p>\n<h4>\u00d6rnek <code>getState<\/code> Kullanan Aksiyon<\/h4>\n<pre><code class=\"language-javascript\">\/\/ src\/actions\/dataActions.js\nexport const fetchDataIfNeeded = () => (dispatch, getState) => {\n  const state = getState();\n  if (state.data.isLoading || state.data.items.length > 0) {\n    return; \/\/ Veri zaten y\u00fckleniyor veya y\u00fcklendi, tekrar \u00e7ekme\n  }\n\n  \/\/ Normalde burada bir API \u00e7a\u011fr\u0131s\u0131 olurdu\n  dispatch({ type: 'FETCH_DATA_REQUEST' });\n  \/\/ Sim\u00fclasyon i\u00e7in hemen ba\u015far\u0131 aksiyonu g\u00f6nderelim\n  setTimeout(() => {\n    dispatch({ type: 'FETCH_DATA_SUCCESS', payload: ['item1', 'item2'] });\n  }, 10);\n};<\/code><\/pre>\n<h4><code>getState<\/code> Kullanan Aksiyon Testi<\/h4>\n<p><code>redux-mock-store<\/code>&#8216;a ba\u015flang\u0131\u00e7 durumu sa\u011flayarak <code>getState<\/code>&#8216;i taklit edebiliriz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/__tests__\/actions\/dataActions.test.js\nimport configureMockStore from 'redux-mock-store';\nimport thunk from 'redux-thunk';\nimport { fetchDataIfNeeded } from '..\/..\/actions\/dataActions';\n\nconst middlewares = [thunk];\nconst mockStore = configureMockStore(middlewares);\n\ndescribe('getState kullanan aksiyonlar', () => {\n  it('veri zaten y\u00fckl\u00fcyse veya y\u00fcklendiyse hi\u00e7bir aksiyon g\u00f6ndermemeli', async () => {\n    \/\/ Durum: veri y\u00fckleniyor\n    let store = mockStore({ data: { isLoading: true, items: [] } });\n    await store.dispatch(fetchDataIfNeeded());\n    expect(store.getActions()).toEqual([]);\n\n    \/\/ Durum: veri zaten y\u00fcklendi\n    store = mockStore({ data: { isLoading: false, items: ['item1'] } });\n    await store.dispatch(fetchDataIfNeeded());\n    expect(store.getActions()).toEqual([]);\n  });\n\n  it('veri y\u00fcklenmediyse ve y\u00fcklenmiyorsa aksiyonlar\u0131 g\u00f6ndermeli', async () => {\n    const expectedActions = [\n      { type: 'FETCH_DATA_REQUEST' },\n      { type: 'FETCH_DATA_SUCCESS', payload: ['item1', 'item2'] },\n    ];\n\n    const store = mockStore({ data: { isLoading: false, items: [] } });\n    await store.dispatch(fetchDataIfNeeded());\n\n    \/\/ Asenkron i\u015flemi beklemek i\u00e7in k\u00fc\u00e7\u00fck bir gecikme ekleyelim (setTimeout y\u00fcz\u00fcnden)\n    \/\/ Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131nda <code>await<\/code> yeterli olurdu.\n    await new Promise((resolve) => setTimeout(resolve, 20));\n\n    expect(store.getActions()).toEqual(expectedActions);\n  });\n});<\/code><\/pre>\n<p>Bu testlerde, <code>mockStore({ data: { isLoading: true, items: [] } })<\/code> gibi bir ba\u015flang\u0131\u00e7 durumu sa\u011flayarak <code>getState()<\/code> \u00e7a\u011fr\u0131s\u0131 yap\u0131ld\u0131\u011f\u0131nda hangi durumun d\u00f6nd\u00fcr\u00fclece\u011fini belirliyoruz. Bu sayede aksiyonun i\u00e7indeki ko\u015fullu mant\u0131\u011f\u0131 test edebiliriz. <code>setTimeout<\/code> kulland\u0131\u011f\u0131m\u0131z i\u00e7in, testin asenkron \u00e7a\u011fr\u0131n\u0131n tamamlanmas\u0131n\u0131 beklemesi i\u00e7in ek bir <code>await new Promise((resolve) => setTimeout(resolve, 20));<\/code> ekledik. Ger\u00e7ek bir API \u00e7a\u011fr\u0131s\u0131nda <code>axios<\/code> gibi k\u00fct\u00fcphaneler <code>Promise<\/code> d\u00f6nd\u00fcrd\u00fc\u011f\u00fc i\u00e7in bu ek gecikmeye genellikle gerek kalmaz.<\/p>\n<h3>Aksiyon Testleri \u0130\u00e7in En \u0130yi Uygulamalar<\/h3>\n<p>1.  <strong>T\u00fcm Yollar\u0131 Test Edin:<\/strong> Asenkron aksiyonlar i\u00e7in hem ba\u015far\u0131 hem de hata durumlar\u0131n\u0131 test etti\u011finizden emin olun.<br \/>\n2.  <strong>D\u0131\u015f Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Taklit Edin:<\/strong> API \u00e7a\u011fr\u0131lar\u0131, <code>Date.now()<\/code>, <code>localStorage<\/code> gibi d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 testlerinizden izole etmek i\u00e7in taklit edin. Bu, testlerin daha h\u0131zl\u0131, daha g\u00fcvenilir ve tekrarlanabilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n3.  <strong>Aksiyon Yarat\u0131c\u0131lar\u0131n\u0131 Odakl\u0131 Tutun:<\/strong> Aksiyon yarat\u0131c\u0131lar\u0131 genellikle durumu do\u011frudan de\u011fi\u015ftirmek yerine <code>dispatch<\/code> etme ve yan etkileri y\u00f6netme sorumlulu\u011funa sahiptir. Karma\u015f\u0131k durum d\u00f6n\u00fc\u015f\u00fcmlerini reducer&#8217;lara b\u0131rak\u0131n.<br \/>\n4.  <strong>A\u00e7\u0131klay\u0131c\u0131 Test \u0130simleri Kullan\u0131n:<\/strong> Testlerinizin neyi test etti\u011fini a\u00e7\u0131k\u00e7a belirten isimler kullan\u0131n. Bu, test ba\u015far\u0131s\u0131z oldu\u011funda sorunu anlaman\u0131za yard\u0131mc\u0131 olur.<br \/>\n5.  <strong>Testleri \u0130zole Edin:<\/strong> Her testin di\u011fer testlerden ba\u011f\u0131ms\u0131z oldu\u011fundan emin olun. <code>afterEach<\/code> kancalar\u0131n\u0131 kullanarak mock&#8217;lar\u0131 s\u0131f\u0131rlamak buna yard\u0131mc\u0131 olur.<br \/>\n6.  <strong>Ger\u00e7ek Aksiyon Yarat\u0131c\u0131lar\u0131n\u0131 Kullan\u0131n:<\/strong> Testlerinizde <code>fetchUsersRequest()<\/code> gibi ger\u00e7ek aksiyon yarat\u0131c\u0131lar\u0131n\u0131 kullan\u0131n, aksiyon nesnelerini do\u011frudan <code>{ type: 'FETCH_USERS_REQUEST' }<\/code> \u015feklinde yazmak yerine. Bu, aksiyon yarat\u0131c\u0131lar\u0131n\u0131zda bir de\u011fi\u015fiklik oldu\u011funda testlerinizin sizi uyarmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Redux aksiyonlar\u0131n\u0131 test etmek, uygulaman\u0131z\u0131n veri ak\u0131\u015f\u0131n\u0131n ve yan etkilerinin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in hayati \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, Jest&#8217;i <code>redux-mock-store<\/code>, <code>redux-thunk<\/code> ve <code>axios-mock-adapter<\/code> gibi yard\u0131mc\u0131 k\u00fct\u00fcphanelerle birlikte kullanarak hem senkron hem de asenkron aksiyon yarat\u0131c\u0131lar\u0131n\u0131 nas\u0131l test edece\u011fimizi \u00f6\u011frendik.<\/p>\n<p>Senkron aksiyonlar i\u00e7in do\u011frudan d\u00f6nd\u00fcr\u00fclen nesneyi do\u011frulamak yeterliyken, asenkron aksiyonlar i\u00e7in <code>redux-mock-store<\/code>&#8216;un <code>dispatch<\/code> edilen aksiyonlar\u0131 kaydetme yetene\u011fini ve HTTP isteklerini taklit etme ara\u00e7lar\u0131n\u0131 kulland\u0131k. <code>getState<\/code> kullanan aksiyonlar i\u00e7in ise mock store&#8217;a bir ba\u015flang\u0131\u00e7 durumu sa\u011flayarak testlerimizi ger\u00e7ekle\u015ftirdik.<\/p>\n<p>Art\u0131k React bile\u015fenlerini, Redux reducer&#8217;lar\u0131n\u0131 ve Redux aksiyonlar\u0131n\u0131 nas\u0131l test edece\u011finizi biliyorsunuz. Bu \u00fc\u00e7 temel ta\u015f\u0131n sa\u011flam bir \u015fekilde test edilmesi, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Bir sonraki b\u00f6l\u00fcmde, Redux selector&#8217;lar\u0131n\u0131 test etme veya t\u00fcm par\u00e7alar\u0131 bir araya getiren entegrasyon testlerine odaklanabiliriz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek\nRedux, React uygulamalar\u0131nda durum y\u00f6net","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":[128],"tags":[],"class_list":{"0":"post-31802","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","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>React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek - 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\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek\" \/>\n<meta property=\"og:description\" content=\"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek Redux, React uygulamalar\u0131nda durum y\u00f6net\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-14T02:40:41+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=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek\",\"datePublished\":\"2025-10-14T02:40:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\"},\"wordCount\":1502,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\",\"name\":\"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-14T02:40:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek\"}]},{\"@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":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek - 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\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek","og_description":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek Redux, React uygulamalar\u0131nda durum y\u00f6net","og_url":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-14T02:40:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek","datePublished":"2025-10-14T02:40:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/"},"wordCount":1502,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/","url":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/","name":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek - B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-14T02:40:41+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-redux-uygulamalarini-jest-ve-enzyme-ile-test-etmek-bolum-3-redux-aksiyonlarini-test-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React \/ Redux Uygulamalar\u0131n\u0131 Jest ve Enzyme ile Test Etmek &#8211; B\u00f6l\u00fcm 3: Redux Aksiyonlar\u0131n\u0131 Test Etmek"}]},{"@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\/31802","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=31802"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31802\/revisions"}],"predecessor-version":[{"id":31803,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31802\/revisions\/31803"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}