Jestjs 如何避免;TypeError:无法设置属性";jest和babel v7的错误?

Jestjs 如何避免;TypeError:无法设置属性";jest和babel v7的错误?,jestjs,babeljs,Jestjs,Babeljs,我有一个项目要从巴贝尔v6升级到巴贝尔v7。让它工作并不难,但我在单元测试代码中遇到了一些问题 import * as Foo 'path/to/foo.js'; Foo.foo = jest.fn().mockReturnValue('whatever'); 对于工作代码foo.js,如下所示 import foo from './bar'; export {foo}; 当我试图在单元测试代码中模拟它时 import * as Foo 'path/to/foo.js'; Foo.foo =

我有一个项目要从巴贝尔v6升级到巴贝尔v7。让它工作并不难,但我在单元测试代码中遇到了一些问题

import * as Foo 'path/to/foo.js';
Foo.foo = jest.fn().mockReturnValue('whatever');
对于工作代码foo.js,如下所示

import foo from './bar';
export {foo};
当我试图在单元测试代码中模拟它时

import * as Foo 'path/to/foo.js';
Foo.foo = jest.fn().mockReturnValue('whatever');
它失败并出现错误:

TypeError: Cannot set property foo of #<Object> which has only a getter
由于foo被定义为exports的getter-only属性,因此它无法再操作导出的foo


目前,我只是更改foo.js,以避免出现这种情况。我想知道这是否是任何babel配置来禁用这种传输。有什么想法吗?

我怀疑巴贝尔使用的传输属性与现在不同。当使用
“use strict”
时,仅定义getter的属性应抛出一个,否则不会给出错误

示例类

module.exports = {
    env: {
        production: {
            presets: [
                [
                    '@babel/preset-env',
                    { loose: false },
                ],
            ],
        },
        test: {
            presets: [
                [
                    '@babel/preset-env',
                    { loose: true },
                ],
            ],
        },
    },
}
class测试类
{
构造函数()
{
这个;
}
获取propOne()
{
把这个还给我;
}
设置propOne(值)
{
这个。_propOne=值;
}
得到两个()
{
返回“多高”;
}
}
const testClass=新的testClass();
console.log(customer.propOne);
customer.propOne=“10英尺!”;
console.log(customer.propOne);
customer.propTwo=“20英尺!”;
巴别塔6.x日志

> JUMP
> 10 Feet!
> HOW HIGH
> HOW HIGH
> JUMP
> 10 Feet!
> HOW HIGH
> Uncaught TypeError: Cannot set property propTwo of #<TestCustomer> which has only a getter
Babel 7.x日志

> JUMP
> 10 Feet!
> HOW HIGH
> HOW HIGH
> JUMP
> 10 Feet!
> HOW HIGH
> Uncaught TypeError: Cannot set property propTwo of #<TestCustomer> which has only a getter
>跳转
>10英尺!
>多高
>未捕获的TypeError:无法设置只有getter的#的属性propTwo

在Babel 7中,可以通过启用禁用此行为。如果您只希望测试环境具有这种行为,那么可以在babelrc/babel.config.js中进一步确定配置的范围

babel.config.js

module.exports = {
    env: {
        production: {
            presets: [
                [
                    '@babel/preset-env',
                    { loose: false },
                ],
            ],
        },
        test: {
            presets: [
                [
                    '@babel/preset-env',
                    { loose: true },
                ],
            ],
        },
    },
}

请参阅。

在一个大型代码库中,我遇到了用jest.mock替换jest.spyOn的现有用法的问题。但是,这个解决方案解决了我遇到的问题。@noahnu我尝试过你的解决方案。这对我不起作用:(