错误:单元测试时未定义Yam

时间:2018-07-09 12:26:43

标签: angular unit-testing jasmine karma-jasmine

我正在对一个应用程序进行单元测试,但我陷入了困境。我在下面用代码段发布问题。

此代码用于弹出Yammer窗口。

yam变量像这样在组件外部声明

declare var yam: any;

@Component({
  selector: 'cs-artifact-related',
  templateUrl: './artifact-related.component.html',
  styleUrls: ['./artifact-related.component.css']
})

,并在以下方法中使用

public yammerWindowPopup(ownername, prjName): void {
    yam.platform.yammerShareOpenPopup({
      customButton: true,
      defaultMessage: this.getYammerWindowPopupMessage(ownername, prjName),
      pageUrl: this.copyArtifactUrl.split('?')[0]
    });
  }

我已经编写了以下代码以对此进行单元测试

it('should call yammerWindowPopup method', () => {
    component.yammerWindowPopup("Owner1", "Test Project");
});

运行ng test时出现此错误

yam is not defined

约束是我无法在内部声明yam,因为它是预先编写的代码。

所以我有两个问题

  1. 如何访问spec文件中组件外部定义的变量?
  2. 如何解决以上错误? 请帮忙!

1 个答案:

答案 0 :(得分:0)

Yam是第三方依赖项。因此,您不要在单元测试中包括它。 测试依赖第三方模块的组件或服务的最佳实践是模拟第三方依赖关系,并在单元测试中使用模拟代替实际的第三方代码。

第1步:模拟山药:

const yamMock = {
    platform: {
        yammerShareOpenPopup: () => {} //just an empty function
    }
}

第2步:使用yamMock代替实际的yam-将其放入组件的单元测试配置中:

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            { 
                provide: yam,
                useValue: yamMock
            }
        ]
    })
});

Step3:监视模拟的yam yammerShareOpenPopup函数是否被调用:

it('should call yammerWindowPopup method', () => {
    spyOn(yam.platform, 'yammerShareOpenPopup');

    component.yammerWindowPopup("Owner1", "Test Project");

    expect(yam.platform.yammerShareOpenPopup).toHaveBeenCalled();
});