2016-08-02 65 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}到您的模拟商店。

相关问题