我有一个简单的效用函数。它需要一个枚举,并将其转换为形状为{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;
我有重复测试。基本上,如果提供枚举,我会检查label / value的输出是否符合预期。这是当前正在运行的测试:
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()
,我还有更多测试,但我省略了。我的问题,这只是这里的优化,是我想使其更好。因此,尽管我会使用酶的map
通过response
和expectedResult
的数组.map(fn) => Array<Any>
。
这就是我所做的:
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接口上保留索引属性才能使其正常工作?有任何想法吗?
答案 0 :(得分:1)
response.map()
不会将索引作为参数sends the value of the array element发送给函数,在您的情况下,这是一个ISelectOption
实例。在您的代码中,index
实际上是您的对象。将其更改为此应该可以:
expect(response.map(obj => obj.label)).toEqual(
expectedResult.map(obj => obj.label)
);