Angular 6单元测试:我想为我的测试存根一个声明的属性

时间:2018-05-31 14:29:45

标签: angular unit-testing testing jasmine

我使用角度版本6和茉莉花。

当我运行测试时--sourceMap = false

我得到的错误是:未定义videojs

如果可能,我想存根视频。 另外,请注意组件运行正常,它只是单元测试失败。

Videojs是一个用于显示视频等的npm库。

我正在测试的组件

    count = 0
    for row in csv_data:
        if count < 1:
            continue
        else:
            cur.execute ("INSERT INTO part_table_test (ID,SCHOOL_CODE,DISTNAME,AC_YEAR,SCHOOL_NAME,STATE_NAME,BLOCK_NAME,CLUSTER_NAME,VILLAGE_NAME,PINCODE,RURURB,ELECTRIC_YN,SCHMGT,LOWCLASS,HIGHCLASS,COMPUTER,CAL_YN,MEDINSTR1,MEDINSTR2,MEDINSTR3,MEDINSTR4) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",row)
        count+=1

我的单元测试

import { AfterViewInit, Component } from '@angular/core';

declare const videojs: any;

@Component({
  selector: 'test-details',
  templateUrl: './test-details.component.html'
})
export class TestDetailsComponent implements AfterViewInit {
  public videoJSplayer: any;

  constructor() {}

  ngAfterViewInit(): void {
    this.initVideo();
  }

  public initVideo(): void {
    this.videoJSplayer = videojs(
      document.getElementById('video_player_id'),
      { controls: true, autoplay: false, preload: 'auto' }
    );
  }
}

2 个答案:

答案 0 :(得分:3)

虽然我同意@ Ryan的回答是更好的方法,但如果你想模拟一个全局变量,你可以在你的规范中设置全局范围的变量。由于它是全球范围的,因此在测试运行后,您需要小心清理它。

beforeEach(() => {
  global.videojs = {my: 'mock', object: 'here'};
});

afterEach(() => {
  delete global.videojs; // Cleanup
});

旁注:如果更符合您的需求,您可以使用window代替global

答案 1 :(得分:2)

您可以注入一个服务,该服务具有对videojs对象/函数的引用,而不是直接在Component中引用它。然后你可以使用provide / useClass在测试中模拟服务,并为你想要的videojs输入任何函数/值