【发布时间】:2020-01-22 09:38:45
【问题描述】:
我正在尝试使用 primeng 测试我的 Angular 8 应用程序,但 karma 显示以下错误:
NullInjectorError: StaticInjectorError(DynamicTestModule)[ButtonDirective -> ElementRef]: StaticInjectorError(Platform: core)[ButtonDirective -> ElementRef]: NullInjectorError: No provider for ElementRef!
我认为这是primeng按钮组件的原因,确实在它的github(primeng/src/app/components/button/button.ts)上我们得到了:
export class ButtonDirective implements AfterViewInit, OnDestroy {
@Input() iconPos: 'left' | 'right' = 'left';
@Input() cornerStyleClass: string = 'ui-corner-all';
public _label: string;
public _icon: string;
public initialized: boolean;
constructor(public el: ElementRef) {}
我尝试了很多东西,但没有任何效果:'(
我试过了:
-
通过使用来模拟元素引用
- { 提供:ElementRef,useClass:MockElementRef },
- { 提供:ElementRef,useValue:MockElementRef },
- 在 tsconfig.json 的路径中添加角度
- 添加 "build": { “preserveSymlinks”:真 } 在 angular.json 中
这是我的 app.component.spec.ts :
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
import {BrowserModule} from "@angular/platform-browser";
import {FormsModule, ReactiveFormsModule} from "@angular/forms";
// Import PrimeNG modules
import {
/**
PRIMENG IMPORTS
**/
ButtonModule
} from "primeng/primeng";
import { } from 'jasmine'
import { ElementRef } from '@angular/core';
export class MockElementRef extends ElementRef {
constructor() { super(null); }
// nativeElement = {};
}
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
let elRef: ElementRef;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
/**
LOTS OF MODULES
**/
ButtonModule,
],
declarations: [
/**
LOTS OF COMPONENTS
**/
],
providers: [
/**
LOTS OF SERVICES
**/
{ provide: ElementRef, useClass: MockElementRef },
// { provide: ElementRef, useValue: MockElementRef },
{ provide: APP_BASE_HREF, useValue: '/' },
{ provide: HTTP_INTERCEPTORS, useClass: HttpClientInterceptor, multi: true },
{ provide: HttpService, useFactory: httpClientCreator, deps: [HttpClient] }
]
}).compileComponents();
// elRef = TestBed.get(MockElementRef);
}));
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy()
});
});
帮帮我pleeeeeeeeeease !!! :'(
*编辑:*
app.module.ts:
// Import PrimeNG modules
import {
CalendarModule,
CheckboxModule,
ContextMenuModule,
DialogModule,
DropdownModule,
GrowlModule,
InputTextareaModule,
PaginatorModule,
PanelModule, SpinnerModule,
TabViewModule, ToolbarModule, TooltipModule, KeyFilterModule, ButtonModule
} from "primeng/primeng";
import {TableModule} from "primeng/table";
/**
LOTS OF IMPORTS
**/
// Enable production mode
enableProdMode();
@NgModule({
imports: [
/**
LOTS OF MODULES
**/
],
declarations: [
AppComponent,
/**
LOTS OF COMPONENTS
**/
],
bootstrap: [
AppComponent
],
providers: [
/**
LOTS OF SERVICES
**/
{ provide: APP_BASE_HREF, useValue: '/' },
{ provide: HTTP_INTERCEPTORS, useClass: HttpClientInterceptor, multi: true },
{ provide: HttpService, useFactory: httpClientCreator, deps: [HttpClient] }
]
})
export class AppModule {
}
* 已解决:*
通过在“测试”部分而不是“构建”部分的 angular.json 中添加 "preserveSymlinks": true 来工作......对我来说很愚蠢
【问题讨论】:
-
请分享
app.module.ts
标签: angular unit-testing karma-jasmine primeng karma-webpack