我在 Angular 中进行了单元测试,但收到此错误:
TypeError: this.translate.get is not a function
at TranslatePipe.updateValue (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@ngx-translate/core/__ivy_ngcc__/fesm2015/ngx-translate-core.js:1126:1)
at TranslatePipe.transform (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@ngx-translate/core/__ivy_ngcc__/fesm2015/ngx-translate-core.js:1167:1)
at ɵɵpipeBind1 (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/fesm2015/core.mjs:22464:1)
at LoginPageComponent_Template (ng:///LoginPageComponent.js:228:33)
我该如何解决这个问题?我已经在导入中添加了
TranslateModule.forRoot()
,但它不起作用。这是我的测试的样子:
const mockTranslateService = jasmine.createSpyObj('TranslateService', ['use']);
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [LoginModalComponent],
imports: [
CommonModule,
BrowserModule,
TranslateModule.forRoot(),
ReactiveFormsModule,
UpgradeModule,
],
providers: [
{ provide: TranslateService, useValue: mockTranslateService },
/*Other services here...*/
],
}).compileComponents();
fixture = TestBed.createComponent(LoginModalComponent);
component = fixture.componentInstance;
});
我根本不使用
get
方法,但我确实使用 use
方法,并且在我的 html 中我使用翻译管道。
<span class="close-button">{{ 'COMMON.CLOSE' | translate }}</span>
这是我的组件:
constructor(
private myService: MyService,
private translateService: TranslateService
) {}
ngOnInit(): void {
const subscription =
this.myService.fetchLanguage().subscribe((info) => {
this.translateService.use(info.language.toLowerCase());
});
this.subscriptions.push(subscription);
}
如果您看到堆栈跟踪,您就会知道
TranslatePipe
使用了 get 方法。我发现你在嘲笑TranslateService
{ provide: TranslateService, useValue: mockTranslateService },
但是您在创建模拟时没有添加 get 方法。请尝试在模拟函数列表中添加
get
方法:
const mockTranslateService = jasmine.createSpyObj('TranslateService', ['use', 'get']);