如何测试使用' redux-api-middleware'的redux操作?和[CALL_API]?

时间:2016-08-02 11:34:27

标签: testing reactjs redux middleware react-redux

我有一个名为addItemsToCollection的动作,它会触发对API的调用:

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返回并返回空对象{}以及动作创建器函数。使用不多。

所以我的问题是,

为什么要返回空对象?

进行此测试的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

CALL_API是一个符号。将对象传递给console.log时,它们不会显示。如果您想查看对象中的密钥,可以Object.getOwnPropertySymbols(expectedAction)console.log(expectedAction[CALL_API]),然后您将获得该对象。 (http://exploringjs.com/es6/ch_symbols.html

您正在测试它。如果您要使用空对象,则不匹配。如果您使用具有不同符号的对象,则它将不匹配。

答案 1 :(得分:1)

对于遇到此问题的任何人,您需要将redux-api-middleware中的{apiMiddleware}添加到您的模拟商店。

答案 2 :(得分:0)

您的预期数据不应计算,因为它是您测试的一部分:

ListBox

您最终可以模拟常量并使用原始数据。

对于您的空对象,它可能取决于您的导入,模拟,测试工具......有太多选项。