错误:<spyOnProperty>:函数未声明为可配置

时间:2019-11-14 08:40:13

标签: javascript angularjs jasmine webpack-4 spy

我已经使用webpack 3进行了茉莉花测试。现在我尝试将其与webpack 4一起使用,但是存在一些问题。

首先,我在 spyOn 函数上遇到问题。

  

错误:: myFunction未声明为可写或没有设置器

我找到了一些有关此问题的解决方法的文章:spy-on-getter-and-setter

我将 spyOn 更改为 spyOnProperty ,但是没有运气。现在我对

有问题

>错误:: myFunction未声明为可配置

我的代码是用js编写的,看起来像这样:

import * as FocusServiceSpy from '../focus/FocusService';

describe('#onLinkClick', function() {
            it('should call myFunction', () => {
                spyOnProperty(FocusServiceSpy, 'myFunction', 'get');
                expect(FocusServiceSpy.myFunction).toHaveBeenCalled();
            });

        }

您知道这可能是什么问题吗?

更新1:

我应该更具描述性。我想在 FocusService 的功能上创建间谍程序。该服务只有一种称为 myFunction 的方法。我唯一想实现的就是确保将调用此方法。

现在我将其更改为……并出现错误:

> TypeError:对象不是构造函数(正在评估“ new FocusService()”)(第180行)     

describe('#onLinkClick', function() {
        const FocusService = require('../focus/FocusService');

        it('should call myFunction', () => {
            const service = new FocusService();
            spyOnProperty(service, 'myFunction').and.callThrough();
            ... (do some action)
            expect(service.myFunction).toHaveBeenCalled();
        });

    }

FocusService 看起来像这样:

export function myFunction(arg) {
    ... (do some action)
}

2 个答案:

答案 0 :(得分:1)

当我尝试将项目从Angular 8升级到9时,我遇到了同样的问题,在Google上找不到答案,但是我想出了一种方法来解决我的项目。

tsconfig.json中,将target更改为es5

示例:

{
  "compilerOptions": {
    ...
    "target": "es5",
    ...
  }
}

就是这样!希望这可以帮助有人尝试找到解决方案。

答案 1 :(得分:0)

在您的单元测试中,我可以看到几个问题。首先,您需要了解spyOnProperty在属性上将spy安装到现有对象上,但是它不会调用getter本身。

  1. 您既不会创建对象,也不会将其提供给spyOnProperty

  2. 您使用函数名称而不是属性来调用spyOnProperty 名称。

您的测试的结构如下:

it('should call myFunction', () => {

    // given
    const service = new FocusService(); 
    const spy = spyOnProperty(service , 'myProperty', 'get').and.callThrough();

    // when
    const myProperty = service.myProperty; 

    // then
    expect(myProperty).toBe(<expected value>);
    expect(spy).toHaveBeenCalled();
});