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

0pizxfdo  于 2023-08-02  发布在  Angular
关注(0)|答案(4)|浏览(134)

我用webpack 3进行了jasmine测试。现在我尝试使用它与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)
}

3bygqnnd

3bygqnnd1#

在你的单元测试中,我可以看到几个问题。首先,您需要了解spyOnPropertyspy的属性安装到现有对象上,但它并不调用getter本身。
1.您既不创建对象,也不将其提供给spyOnProperty
1.使用函数名而不是属性名调用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();
});

字符串

332nm8kg

332nm8kg2#

当我试图将项目从Angular 8升级到9时,我也遇到过同样的问题,我在谷歌上找不到答案,但我找到了一种方法如何在我的项目中解决它。
tsconfig.json中,将target更改为es5
示例如下:

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

字符串
就是这样!希望这能帮助那些试图找到解决方案的人。

9fkzdhlc

9fkzdhlc3#

随着Jasmine的更新版本,间谍的变异是不允许的,并抛出上述错误的间谍成员你试图修改。
不建议更改间谍属性的定义,因为Jasmine明确禁止成员可配置。

将下面的代码添加到你的入门测试文件如果你不希望这个限制强加于你。

const defineProperty = Object.defineProperty;
Object.defineProperty = (o, p, c) => defineProperty(o, p, Object.assign({}, c ?? {}, { configurable: true }));

字符串
上面的代码强制将测试运行期间定义的每个属性标记为可配置的。

qxsslcnc

qxsslcnc4#

在Classdefinition文件中导入后添加configure({ safeDescriptors: false });,它与属性一起工作

相关问题