如何在 Jest 中模拟只读属性?

问题描述 投票:0回答:2

我有一个函数,可以将大写字符串转换为大写字母前面带有破折号的字符串,并使字符串小写。

formattedType() {
        // Adds a dash before the uppercase and make everything lowercase
        const type = this.props.type?.split(/(?=[A-Z])/).join("-").toLowerCase();
        return type;
}

describe("formattedType method", () => {
    it("should transform the string into lowercase with a dash as seperator", () => {
        // given
        FormTrack.prototype.props.type= 'testOption';
        

        // when
        const actualResult = FormTrack.prototype.formattedFormType();

        // then
        expect(actualResult).toBe('test-option');
    });
});

但是我收到以下错误:

Cannot assign to 'type' because it is a read-only property

如何模拟 props 类型来覆盖功能

formattedType()

reactjs unit-testing jestjs enzyme
2个回答
1
投票

您可以使用静态方法 Object.defineProperty 直接在对象上定义新属性或修改对象上的现有属性。

例如:

describe("formattedType method", () => {
    it("should transform the string into lowercase with a dash as seperator", () => {
        // given
        Object.defineProperty(FormTrack.prototype.props, 'type', {value: 'testOption' });

        // when
        const actualResult = FormTrack.prototype.formattedFormType();

        // then
        expect(actualResult).toBe('test-option');
    });
});

0
投票

您可以将类型转换为新类型,其中所有属性都是可变的。

导出类型 Mutable = { -readonly [P in keyof T]: T[P] } export const asMutable = (value: T): Mutable => value as Mutable

asMutable(FormTrack.prototype.props).type

© www.soinside.com 2019 - 2024. All rights reserved.