покрытие кода не достигает функции void set

#javascript #jestjs

#javascript #jestjs

Вопрос:

Покрытие кода не достигает некоторых строк кодов, хотя я их тестирую. 🙁

Вот декоратор bind.ts и [[НЕ ОХВАЧЕНО]] тег покрытия кода, который я создал. В настоящее время набор (значение) не покрывается тестом, хотя я его покрываю.

 type Descriptor<T> = TypedPropertyDescriptor<T>;

export default function bind<T = Function>(
  target: object,
  key: string,
  descriptor: Descriptor<T>
): Descriptor<T> {
  ...
    set(value: T): void {
    [[22-NOT COVERED]]  if (process.env.NODE_ENV !== 'test') {
    [[23-NOT COVERED]]    throw new Error('Unable to set new value to decorated method');
    [[24-NOT COVERED]]  }
    [[25-NOT COVERED]]  Object.defineProperty(this, key, { ...descriptor, value });
    },
  };
}

  

bind.spec.ts
Моя стратегия заключается в создании нового компонента класса и проверке его контекста при вызове

 class MockClass extends React.PureComponent<Props, State> {
  @bind
  getProp(): string {
    const { propName } = this.props;
    return propName;
  }

  @bind
  getState(): string {
    const { stateName } = this.state;
    return stateName;
  }

  @bind
  setProp(value: string): void {
    this.state = { stateName: value };
  }
}

...

describe('bind', () => {
  const mockState = {
    stateName: 'stateName',
  };

  const mockProp = {
    propName: 'propName',
  };

  const mockClass = new MockClass(mockProp, mockState);

  ...

  it('should have called it once', () => {
    expect(mockClass.getProp()).toBe(mockProp.propName);
  });

  it('should have called it in setState', () => {
    expect(mockClass.setProp('newState')).toBe(undefined); <<<- This can cover 22-25??
  });
  

Ответ №1:

Непокрытый установщик — это код, который будет использоваться, если вы зададите значение свойства класса. У вас нет никакого тестового кода, который делает это. Вы только получаете свойство с именем setProp , а затем вызываете его. Тот факт, что в имени свойства есть «set», может вводить в заблуждение.

Ваш тестовый код должен был бы сделать что-то вроде этого, чтобы протестировать установщик декоратора:

 mockClass.props.otherPropName = 'blah';
mockClass.getProp = function() {
  const { otherPropName } = this.props;
  return otherPropName;
};
expect(mockClass.getProp()).toEqual('blah');
  

Комментарии:

1. Спасибо @Jacob. Но я получаю эту ошибку otherPropName :

2. Невозможно присвоить ‘otherPropName’, поскольку это свойство доступно только для чтения.ts(2540)

3. Средство получения перезаписывает свойство, делая его доступным только для чтения: Object.defineProperty(this, key, { ...descriptor, value });