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

Mor*_*eng 8 babel jestjs

我有一个项目要从babel v6升级到babel v7.为了使它工作并不难,但我在单元测试代码中遇到了一些问题.

对于像下面这样的代码foo.js.

import foo from './bar';
export {foo};
Run Code Online (Sandbox Code Playgroud)

当我尝试在单元测试代码中模拟它时.

import * as Foo 'path/to/foo.js';
Foo.foo = jest.fn().mockReturnValue('whatever');
Run Code Online (Sandbox Code Playgroud)

它失败并出现错误:

TypeError: Cannot set property foo of #<Object> which has only a getter
Run Code Online (Sandbox Code Playgroud)

事实证明,babel v7的转换与v6不同.它将foo.js编译成:

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "foo", {
  enumerable: true,
  get: function get() {
    return _bar.default;
  }
});
Run Code Online (Sandbox Code Playgroud)

由于foo被定义为导出的仅getter属性,因此无法再操纵导出的foo.

目前,我只是改变foo.js以避免这种转换.我想知道这是否是任何禁用这种转换的babel配置.有任何想法吗?

roy*_*key 0

我怀疑 Babel 用来转译属性的方式与现在不同。仅定义 getter 的属性TypeError在使用时预计会抛出 a "use strict",否则不会给出错误。

示例类

class TestClass
{
  constructor ()
  {
    this._propOne = "JUMP";
  }

  get propOne ()
  {
    return this._propOne;
  }

  set propOne (value)
  {
    this._propOne = value;
  }

  get propTwo ()
  {
    return "HOW HIGH";
  }
}

const testClass = new TestClass();

console.log(customer.propOne);
customer.propOne = "10 Feet!";
console.log(customer.propOne);
customer.propTwo = "20 Feet!";

Run Code Online (Sandbox Code Playgroud)

通天塔 6.x 日志

> JUMP
> 10 Feet!
> HOW HIGH
> HOW HIGH
Run Code Online (Sandbox Code Playgroud)

Babel 7.x 日志

> JUMP
> 10 Feet!
> HOW HIGH
> Uncaught TypeError: Cannot set property propTwo of #<TestCustomer> which has only a getter
Run Code Online (Sandbox Code Playgroud)