Angular Unit Test:如果构造函数将 Globals.ts 文件作为参数,如何创建组件实例

Posted

技术标签:

【中文标题】Angular Unit Test:如果构造函数将 Globals.ts 文件作为参数,如何创建组件实例【英文标题】:Angular Unit Test: How to create component instance if constructor takes Globals.ts file as an argument 【发布时间】:2021-12-13 13:29:03 【问题描述】:

我正在尝试为我的 Angular 6 应用程序的登录组件编写单元测试。

login.component.ts 文件有如下构造函数

constructor(public global: Globals, private appService: AppService ) 

这里的 Globals 是一个普通的 ts 文件,它有一些跨组件使用的全局函数。 AppService 是一种服务。

我当前的 spec.ts 文件

describe('LoginComponent', () => 
  let component: LoginComponent;
  let fixture: ComponentFixture<LoginComponent>;

  beforeEach(async(() => 
    TestBed.configureTestingModule(
      declarations: [ LoginComponent ],
      imports:[
        FormsModule,
        ReactiveFormsModule,
      ],
      providers:[
        AppService
      ]
    )
    .compileComponents();
  ));
   beforeEach(() => 
    fixture = TestBed.createComponent(LoginComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  );

  it('should create', () => 
    expect(component).toBeTruthy();
  );
);

这里的组件实例未定义。

谁能指导如何为此案例创建 TestBed 配置模块并创建组件的实例?

【问题讨论】:

【参考方案1】:

This 是学习测试的绝佳资源。

对于你的情况,我会模拟 GlobalsAppService 的公共方法。

describe('LoginComponent', () => 
  let component: LoginComponent;
  let fixture: ComponentFixture<LoginComponent>;
  let mockGlobals: jasmine.SpyObj<Globals>;
  let mockAppService: jasmine.SpyObj<AppService>;

  beforeEach(async(() => 
    mockGlobals = jasmine.createSpyObj('Globals', [/*public methods you want to mock go here as an array of strings */]);
    mockAppService = jasmine.createSpyObj('AppService', [/ *public methods you want to mock go here as an array of strings */]);
    TestBed.configureTestingModule(
      declarations: [ LoginComponent ],
      imports:[
        FormsModule,
        ReactiveFormsModule,
      ],
      providers:[
        // provide mocks when component wants actual services
         provide: Globals, useValue: mockGlobals ,
         provide: AppService, useValue: mockAppService 
      ]
    )
    .compileComponents();
  ));
   beforeEach(() => 
    fixture = TestBed.createComponent(LoginComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  );

  it('should create', () => 
    expect(component).toBeTruthy();
  );
);

createSpyObj 有很多签名,你可以做更多的研究。我提供的链接还显示了如何模拟依赖项的其他方法。

【讨论】:

以上是关于Angular Unit Test:如果构造函数将 Globals.ts 文件作为参数,如何创建组件实例的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚为啥 res.json() 没有在 Unit Test Coverage, Angular 中命中

Angular Unit Test 应该创建 FAILED TypeError: Cannot read properties of undefined (reading 'preferences')

更新到 Angular 10 后,如果没有“new”,就无法调用类构造函数 UpgradeComponent

如果定义了构造函数,py.test 会跳过测试类

在Jasmine Unit Test中为PhantomJS配置浏览器语言

如何在 Angular 2 中调用其构造函数之前将数据发送或绑定到子组件?