#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 });