gpt4 book ai didi

angular - 无法读取未定义的属性取消订阅 : Angular2 testing

转载 作者:太空狗 更新时间:2023-10-29 17:32:09 25 4
gpt4 key购买 nike

我正在尝试测试一个具有 ngOnDestroy() 方法的组件,该方法具有所有 unsubscribe() 方法调用。但是,在测试时,当我运行我的测试文件(规范文件)时,它给我错误提示:

cannot read property 'unsubscribe' of undefined

我在我的测试文件中完成了以下导入:

import { Subscription }   from 'rxjs/Subscription';

所以我认为这应该足以获取 Subscription 中的所有方法,但错误仍然存​​在。此外,我尝试将“订阅”添加到测试文件的“导入”、“声明”和“提供者”列表中,但错误仍然存​​在。

下面是一段代码:

//component
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import {
NinjaService } from '../../../../ninja.service';


@Component({
selector: 'ninja-files',
templateUrl: './ninja-files.component.html',
styleUrls: ['./ninja-files.component.css']
})
export class ninjaFilesComponent implements OnInit, OnDestroy {

showNinjaFiles: boolean = true;

addFileSubscription: Subscription;

constructor(private ninjaService: NinjaService) {
........
}

ngOnInit() {
this.addFileSubscription = this.NinjaService.AddedFile$
.subscribe((fileFormat: FileFormat) => {
console.log('File being added: ' + fileFormat.fileName); }

ngOnDestroy() {
this.addFileSubscription.unsubscribe();
}
}

然后我有这个组件的测试文件如下:

import { Component, OnInit, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import {
NinjaService } from '../../../../ninja.service';
import { TestBed, async, fakeAsync ,ComponentFixture, } from '@angular/core/testing';
import { DebugElement } from '@angular/core';
import { By } from '@angular/platform-browser';
import {} from 'jasmine';

describe('Component: NinjaFiles', () => {

let fixture: ComponentFixture<ninjaFilesComponent>;
let component: ninjaFilesComponent;
let ninjaServiceStub;

beforeEach( async(() => {
//stub NinjaService
let ninjaServiceStub= {};

fixture = TestBed.configureTestingModule({
declarations: [ ninjaFilesComponent],
}).createComponent(ninjaFilesComponent);
component = fixture.componentInstance;

}));

it('Page Title', async(() => {
let pageTitle = fixture.debugElement.query(By.css('.page-title'));
expect(pageTitle).toBeTruthy();
}));

it('Counting the files', () => {
let fileCount= fixture.debugElement.query(By.css('.file-count'));
expect(fileCount).toBeTruthy();
});

当我运行上面的测试代码时,它给我错误消息“无法读取未定义的属性‘取消订阅’”(这意味着它无法定义我在组件类中定义的订阅对象‘addFileSubscription’ .

有人可以建议解决方法吗?

最佳答案

import { Subscription } from 'rxjs/Subscription';

这意味着您可以从 ninjaFilesComponent 类文件访问 Subscription 类。

问题是 addFileSubscription 从未被初始化。为了调用 ngOnInit,您需要调用

fixture.detectChanges();

除此之外,我看到的其他问题是:

  1. 永远不要将 stub 添加到提供者

    TestBed.configureTestingModule({
    providers: [
    { provide: NinjaService, useValue: ninjaServiceStub }
    ]
    })
  2. 您需要在 stub 中实际实现一些东西

    let ninjaServiceStub = {
    AddedFile$: Observable.of(new FileFormat(...))
    }
  3. 您没有正确使用组件中的服务

    this.NinjaService.AddedFile$
    // should be
    this.ninjaService.AddedFile$
    // lowercase

关于angular - 无法读取未定义的属性取消订阅 : Angular2 testing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40310095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com