2016-08-02 68 views
5

我有一個名爲addItemsToCollection動作觸發調用像這樣的API:如何測試使用'redux-api-middleware'和[CALL_API]的redux動作?

import {CALL_API} from 'redux-api-middleware'; 

export function addItemsToCollection(collectionId, itemIds) 
{ 
    return {[CALL_API]: 
    { 
     endpoint: `/collections/${collectionId}/items`, 
     method: 'POST', 
     body: JSON.stringify(itemIds), 
     types: 
     [ 
     ADD_ITEMS, 
     { type: ADD_ITEMS_SUCCESS }, 
     ADD_ITEMS_FAIL 
     ] 
    } 
    }; 
} 

當我嘗試簡單的寫一個測試這個動作被創建,如:

it('should create an action to add items to a collection',() => 
{ 
    const collectionId = 1; 
    const itemIds = [1,2,3]; 

    const expectedAction = 
    { 
    [CALL_API]: 
    { 
     endpoint: `/collections/${collectionId}/items`, 
     method: 'POST', 
     body: JSON.stringify(itemIds), 
     types: 
     [ 
     ADD_ITEMS, 
     { type: ADD_ITEMS_SUCCESS }, 
     ADD_ITEMS_FAIL 
     ] 
    } 
    }; 

    expect(addItemsToCollection(collectionId, itemIds)).toEqual(expectedAction); 
}); 

它確實但是那是因爲它正在爲expectedAction以及動作創建者函數返回併爲空對象{}。沒多大用處。

所以我的問題是,

爲什麼被退回空的對象?

什麼是做這個測試的正確方法?

回答

0

您預期的數據不應該被計算,因爲它是你正在測試的內容的一部分:

const expectedAction = 
{ 
    [CALL_API]: { 
    endpoint: '/collections/1/items', 
    method: 'POST', 
    body: "[1,2,3]", 
    types: 
    [ 
     ADD_ITEMS, 
     { type: ADD_ITEMS_SUCCESS }, 
     ADD_ITEMS_FAIL 
    ] 
    } 
}; 

最後,您可以嘲笑常量和使用原始數據。

對於您的空對象,它可能取決於您的導入,嘲笑,測試工具...有太多選項。

1

CALL_API是一個符號。它們在將對象傳遞給console.log時不顯示。如果你想看到對象中的鑰匙,你可以做Object.getOwnPropertySymbols(expectedAction)或者你可以console.log(expectedAction[CALL_API]),你會得到那個對象。 (http://exploringjs.com/es6/ch_symbols.html

您正在測試它。如果您要使用空對象,則不匹配。如果您使用具有不同符號的對象,它將不匹配。

0

對於任何有這個問題的人,您需要從redux-api-middleware添加{apiMiddleware}到您的模擬商店。

相關問題