可以将webpack 4模块配置为允许Jasmine监视其成员吗?

问题描述 投票:10回答:3

我一直无法使用webpack 4运行我的测试茉莉花测试套件。升级webpack后,几乎每个测试都会出现以下错误:

Error: <spyOn> : getField is not declared writable or has no setter 

这是由于我们用于为简单函数创建spys的常见模式是:

import * as mod from 'my/module';
//...
const funcSpy = spyOn(mod, 'myFunc');

我玩过module.rules[].type,但似乎都没有选择。

这个webpack GH issue表示ECMA模块是不可写的,对于网络来说是有意义的,但是真的没有可用于测试的解决方法吗?

相关包版本:

"jasmine-core": "2.6.4",
"typescript": "2.5.3",
"webpack": "4.1.1",
"webpack-cli": "^2.0.12",
"karma": "^0.13.22",
"karma-jasmine": "^1.1.0",
"karma-webpack": "^2.0.13",
typescript webpack jasmine karma-jasmine webpack-4
3个回答
13
投票

spyOnProperty允许通过将accessType参数设置为'get'来将属性视为只读。

然后你的设置就像

import * as mod from 'my/module';
//...
const funcSpy = jasmine.createSpy('myFunc').and.returnValue('myMockReturnValue');
spyOnProperty(mod, 'myFunc', 'get').and.returnValue(funcSpy);

2
投票

添加到@Anton Poznyakovskiy的回答:

为方便起见,我已将此TypeScript函数添加到我的共享测试模块中:

export const spyOnFunction = <T>(obj: T, func: keyof T) => {
  const spy = jasmine.createSpy(func as string);
  spyOnProperty(obj, func, 'get').and.returnValue(spy);

  return spy;
};

用法示例:

import * as mod from 'my/module';
//...
spyOnFunction(mod, 'myFunc').and.returnValue('myMockReturnValue');

1
投票

this GitHub issue他们得出相同的结论;意图是不可变的出口。但是用户lavelle有一个解决方法(在this comment中),他们为测试和生产代码创建了不同的webpack配置。测试配置使用"commonjs"模块,这似乎通过不创建getter而为它们工作。

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