来自 node_modules 的 Angular 单元测试 spyOn 类

Posted

技术标签:

【中文标题】来自 node_modules 的 Angular 单元测试 spyOn 类【英文标题】:Angular unit test spyOn class from node_modules 【发布时间】:2020-12-16 15:53:47 【问题描述】:

我正在尝试创建一个间谍以确保从 node_modules 类调用函数 例如在 obs.d.ts 中:


export declare module Obs 
   
    class MyService 
    
         
        func(params: Object): Promise<void>;

所以我想监视 func()

在我目前正在尝试的测试中:

import  Obs  from 'obs';


describe('CurrentService', () => 

 let test: Obs.MyService;

let spy;

 beforeEach(() => 

//test.func();  //this works

spy = spyOn(test, 'func');   // spy does not

    TestBed.configureTestingModule();
    service = TestBed.get(CurrentService);

    expect(spy).toHaveBeenCalled();

func 方法应该在 CurrentService 的构造函数中调用。

得到错误:“错误::找不到用于 func() 的对象”

问题在于无法识别 spy 中的 func 方法,即使 test.func() 有效(请参阅代码的注释部分)。

不确定这是否是导入问题。我相信,如果您实际创建了类(即 test = new Obs.MyService() ,那么间谍将起作用,但这将是无用的,因为 CurrentService 中没有触及新的类实例。

感谢您的帮助。

【问题讨论】:

你不会在 CurrentService 中注入 obs 吗?你不能只是嘲笑它然后监视它..而不是试图调用真实的东西。 没有从节点模块导入Obs 在构造函数中调用的函数中调用它 只需要确保它被调用,无法访问服务中的函数,因为在构建之前无法设置间谍,并且该函数启动整个应用程序,因此不能轻易创建新服务 【参考方案1】:

试试这个,虽然这也可能不起作用:

import * as ObsContainer from 'obs';


describe('CurrentService', () => 

let spy;

 beforeEach(() => 

//test.func();  //this works

spy = spyOn(ObsContainer.MyService, 'func');

    TestBed.configureTestingModule();
    service = TestBed.get(CurrentService);

    expect(spy).toHaveBeenCalled();

【讨论】:

谢谢,我已经尝试过了,在这里不工作,不知道为什么

以上是关于来自 node_modules 的 Angular 单元测试 spyOn 类的主要内容,如果未能解决你的问题,请参考以下文章

模块构建失败(来自 ./node_modules/sass-loader/dist/cjs.js)

来自util.js的Angular 6 SCSS编译错误

Angular 6 - '"/node_modules/firebase/index"' 没有导出的成员 'functions'

angular-cli.json中node_modules路径的智能感知?

angular中安装@angular/cdk时遇到的错误——node_modules/@angular/cdk/table/table.d.ts:277:9 - error TS1086: An ac

Angular:在 node_module 组件中覆盖 DatePipe