【问题标题】:Jest - Map through an Array of Items and test their ValuesJest - 映射一组项目并测试它们的值
【发布时间】:2019-08-15 17:41:56
【问题描述】:

我有一个简单的实用功能。它需要一个 Enum,然后将其转换为形状为 {label: string, value:string} 的对象数组。

这里是函数以及它使用的接口:

export interface ISelectOption {
  value: string;
  label: string;
  selected?: boolean;
}

const transformEnumToISelectArray = (object: object): ISelectOption[] =>
  Object.keys(object).map(value => ({
    label: value,
    value
  }));

export default transformEnumToISelectArray;

我有一个重复的测试。基本上,如果我提供枚举,我会检查标签/值的输出是否是预期的。这是当前正在运行的测试:

import transformEnumToISelectArray from '../transformEnumToISelectArray';
import ISelectOption from '../../interfaces/ISelectOption';

describe('transformEnumToISelectArray', () => {
  enum mockEnum {
    FIELD1 = 'FIELD1',
    FIELD2 = 'FIELD2',
    FIELD3 = 'FIELD3'
  }

  let expectedResult: ISelectOption[] = [];
  let nonExpectedResult: ISelectOption[] = [];

  describe('ExpectedResults', () => {
    beforeEach(() => {
      expectedResult = [
        {
          label: 'FIELD1',
          value: 'FIELD1'
        },
        {
          label: 'FIELD2',
          value: 'FIELD2'
        },
        {
          label: 'FIELD3',
          value: 'FIELD3'
        }
      ];
    });
    it('should return an Array of ISelectOption shaped Object with correct `label` and `value`', () => {
      const response = transformEnumToISelectArray(mockEnum);
      expect(response[0].label).toEqual(expectedResult[0].label);
      expect(response[1].label).toEqual(expectedResult[1].label);
      expect(response[2].label).toEqual(expectedResult[2].label);
      expect(response[0].value).toEqual(expectedResult[0].value);
      expect(response[1].value).toEqual(expectedResult[1].value);
      expect(response[2].value).toEqual(expectedResult[2].value);
    });
  });
});

请忽略beforeEach(),我有更多测试,但我省略了它们。我的问题,这只是一个优化,是我想让它变得更好。所以,我虽然会通过 responseexpectedResult 的数组使用 Enzymes 的 .map(fn) => Array<Any> map

这就是我所做的:

expect(response.map(index => response[index].lable)).toEqual(
        expectedResult.map(index => expectedResult[index].label)
      );

但我得到以下信息:

Type 'ISelectOption' cannot be used as an index type.ts(2538)

有没有人明白这一点。我是否需要在我的 ISelectOption 接口上设置一个 index 属性才能使其工作?有什么想法吗?

【问题讨论】:

    标签: reactjs typescript unit-testing jestjs enzyme


    【解决方案1】:

    response.map() 不会将索引作为参数发送给函数,它是sends the value of the array element,在您的情况下,这是一个ISelectOption 实例。在您的代码中,index 实际上是您的对象。将其更改为此应该可以:

    expect(response.map(obj => obj.label)).toEqual(
            expectedResult.map(obj => obj.label)
          );
    

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多