使用 L10nTranslate 实现 Angular 测试

Implement Angular Test with L10nTranslate

提问人:Marvin Valke 提问时间:11/10/2023 更新时间:11/14/2023 访问量:16

问:

我正在尝试在 Angular 应用程序中使用 Karma 实现测试。 我遇到了一个问题,因为我的组件使用了 L10nTranslate,所以我尝试将模块导入我的测试文件

我的组件

@Component({
  selector: 'app-task',
  templateUrl: './task.component.html',
  styleUrls: ['./task.component.scss'],
  providers: [
    {provide: MAT_DATE_LOCALE, useValue: 'fr-FR'},
  ],
})

export class TaskComponent implements OnInit, OnDestroy {

 
  constructor(
    private route: ActivatedRoute,
    private router: Router,
    private taskService: TaskService,
    private taskListService: TaskListService,
    private taskListHasTaskService: TaskListHasTaskService,
    private projectService: ProjectService,
    private projectStoreService: ProjectStoreService,
    private commentService: CommentService,
    public sessionService: SessionService,
    public clipboard: Clipboard,
    public snackBar: MatSnackBar,
    private taskModalService: TaskModalService,
    public dialog: MatDialog,
    private errorService: ErrorService,
    private taskUpdateHandlerService: TaskUpdateHandlerService,
    private translation: L10nTranslationService,
    private attachmentService: AttachmentService,
    public userAuthorizationService: UserAuthorizationService,
    private sseService: SseService,
    private _location: Location,
    private translationService: L10nTranslationService,
    private flattenTasksPipe: FlattenTasksPipe
  ) {
  }



  ngOnInit(): void {

}

我的测试文件

describe('TaskComponent', () => {
    let component: TaskComponent;
    let fixture: ComponentFixture<TaskComponent>;
    let service: L10nTranslationService;

    beforeEach(async () => {
        await TestBed.configureTestingModule({
            declarations: [TaskComponent, MatMenu],
            imports: [MatDialogModule, MatMenuModule, L10nTranslationModule],
            providers: [
                {provide: ActivatedRoute, useValue: {}},
                {provide: L10nTranslationService, useValue: {}},
                {provide: MatSnackBar, useValue: {}},
                {provide: Router, useValue: {}},
                {provide: TaskService, useValue: {}},
                {provide: TaskListService, useValue: {}},
                {provide: TaskListHasTaskService, useValue: {}},
                {provide: ProjectService, useValue: {}},
                {provide: ProjectStoreService, useValue: {}},
                {provide: CommentService, useValue: {}},
                {provide: SessionService, useValue: {}},
                {provide: TaskModalService, useValue: {}},
                {provide: ErrorService, useValue: {}},
                {provide: TaskUpdateHandlerService, useValue: {}},
                {provide: AttachmentService, useValue: {}},
                {provide: UserAuthorizationService, useValue: {}},
                {provide: SseService, useValue: {}},
                {provide: Location, useValue: {}},
                {provide: FlattenTasksPipe, useValue: {}}
            ]
        })
            .compileComponents();

        fixture = TestBed.createComponent(TaskComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
        service = TestBed.inject(L10nTranslationService);
    });

    it('should return a string', () => {
            expect(component.dummyFunction(42)).toBe('42');
        });

    });

我总是收到错误Chrome 119.0.0.0 (Mac OS 10.15.7) TaskComponent应返回字符串FAILED TypeError:this.translation.onChange 不是函数 在新的 L10nAsyncPipe (node_modules/angular-l10n/fesm2020/angular-l10n.mjs:678:43) 在新的 L10nTranslateAsyncPipe (node_modules/angular-l10n/fesm2020/angular- l10n.mjs:1080:1) 在L10nAsyncPipe_Factory (node_modules/angular-l10n/fesm2020/angular-l10n.mjs:687:19) 在 pipeFactory (node_modules/angular-l10n/fesm2020/angular-l10n.mjs:1087:138) 在ɵɵpipe(node_modules/@angular/core/fesm2020/core.mjs:20735:30) 在 templateFn (ng:///TaskComponent.js:640:9) 在 executeTemplate (node_modules/@angular/core/fesm2020/core.mjs:10441:9) 在 renderView (node_modules/@angular/core/fesm2020/core.mjs:10263:13) 在 renderComponent (node_modules/@angular/core/fesm2020/core.mjs:11434:5) 在 renderChildComponents (node_modules/@angular/core/fesm2020/core.mjs:10122:9) Chrome 119.0.0.0 (Mac OS 10.15.7):已执行 5 个(共 5 个)(1 个失败)(0.144 秒 / 0.126 秒) 总计:1 次失败,4 次成功

我不知道如何解决这个问题。所有模块都已正确导入,到目前为止,所有模块都是最新的,我不知道如何开始测试。

感谢您的帮助

我尝试导入/声明我的组件类中使用的所有模块。 我尝试了几种注入 L10nTranslationModule 和/或 L10nTranslationService 的方法

我总是以错误告终

Angular TypeScript 单元 Karma-Jasmine 测试平台

评论


答:

0赞 AliF50 11/14/2023 #1

问题很可能出在这条线上:

{provide: L10nTranslationService, useValue: {}},

我们提供了一个空对象,因此没有方法。L10nTranslationServiceonChange

要快速解锁,请尝试以下操作:

{provide: L10nTranslationService, useValue: { onChange: () => null }},

您很可能也必须准确地模拟其他提供程序,并且它们不能是空对象。

这是一篇关于测试具有依赖项的组件的好文章: https://testing-angular.com/testing-components-depending-on-services/#testing-components-depending-on-services