我正在使用TypeScript,Angular和Jest编写应用程序。我正在使用JitsiMeetExternalAPI script(现在并不重要->我将使用vendorClass()
进行简化)。该脚本包含一个我在组件中使用的类。看看下面的代码:
app.component.ts
import { Component, AfterViewInit } from '@angular/core';
import '../vendor/script.js';
declare const vendorClass: any;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {
vendorObject: any;
constructor() {}
ngAfterViewInit() {
this.vendorObject= new vendorClass();
}
}
此代码运行良好。 vendorObject
已在应用程序运行时成功加载。
当我开玩笑地进行单元测试时,问题就来了。让我向您展示测试代码:
app.component.spec.ts
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
let fixture: ComponentFixture<AppComponent>;
let component: AppComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [AppComponent]}).compileComponents();
}));
test('AppComponent should be created', () => {
// arrange
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
// assert
expect(component).toBeTruthy();
});
});
测试导致错误:
ReferenceError: vendorClass is not defined
17 |
18 | ngAfterViewInit() {
> 19 | this.vendorObject= new vendorClass();
| ^
20 | }
21 |
22 | }
我在这里遇到问题。测试不知道脚本和vendorClass。我正在寻找解决方案,该方法如何将第3方脚本和它的vendorClass注入到单元测试中,因此它应该可以识别该类,但到目前为止没有成功...
任何帮助都会很棒!
谢谢
卡米尔
更新
也许我应该征询从现在开始我尝试过的事情:
setupFiles
中使用packe.json
来在每次测试之前加载脚本:[...]
"jest": {
"preset": "jest-preset-angular",
"setupFiles": [
"<rootDir>/src/vendor/script.js"
],
"setupFilesAfterEnv": [
"<rootDir>/setupJest.ts"
]
}
[...]
angular.json
文件中设置测试脚本:[...]
{
[...]
"projects": {
"myProject": {
[...]
"architect": {
[...]
"test": {
[...]
"options": {
[...]
"scripts": ["/src/vendor/script.js"]
}
}
}
}
}
[...]
script.js
导入了测试文件app.component.spec.ts
中。