Webpack 4模块是否可以配置,以允许Jasmine对它们的成员进行间谍监视?

28

我无法通过Webpack 4运行我的Jasmine测试套件。在升级Webpack之后,几乎在每个测试中都会得到以下错误:

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

这是因为我们用于创建简单函数的间谍的常见模式是:

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

我已经尝试过更改module.rules[].type,但没有一个选项看起来能解决问题。

在这个Webpack的GH issue中指出ECMA模块不应该可写,这在Web上是有意义的,但是难道测试真的没有变通之处吗?

相关软件包版本:

"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",
4个回答

26

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

然后您的设置将如下所示

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

19
有点奇怪,这对我不起作用。它失败并显示以下错误:=== 错误: <spyOnProperty> : myFunc 未声明为可配置 ===。这是我声明函数的方式:export var myFunc = function(){...}; - Amer Mograbi
请在此处查看fixedSpyOn函数的代码 github.com/jasmine/jasmine/issues/1414#issuecomment-457878397 - Richard Collette
1
@AmerMograbi,你找到避免错误的方法了吗? - pred

3
有一个 GitHub 问题,他们得出了相同的结论:不可变输出是有意义的。但是用户 lavelle 提出了一种解决方法(在这个评论中),他们为测试和生产代码创建了不同的 webpack 配置。测试配置使用 "commonjs" 模块,这似乎对他们有用,因为它不会创建 getter。

3

在 @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
为了解决这个问题,可以将方法包装在自定义类中,然后进行模拟。
以下是示例:
//Common Utility

import * as library from './myLibrary'

export class CustomWrapper{
    static _func = library.func;
}

//Code File
import { CustomWrapper } from './util/moduleWrapper';

const output = CustomWrapper._func(arg1, arg2);

//Test File 

import { CustomWrapper } from './util/moduleWrapper';

spyOn(CustomWrapper, '_func').and.returnValue('mockedResult');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接