gpt4 book ai didi

javascript - Angular 9 测试组件依赖于可观察的服务 - 无法读取未定义的属性 'subscribe'

转载 作者:行者123 更新时间:2023-12-01 16:25:20 25 4
gpt4 key购买 nike

我正在拼命地尝试测试一个正在使用服务的组件。我使用 spy 来模拟它,但每次我运行测试时它都会失败并出现异常:

Cannot read property 'subscribe' of undefined

我的测试是这样的:

describe('FilmOverviewComponent', () => {
let component: FilmOverviewComponent;
let fixture: ComponentFixture<FilmOverviewComponent>;

let filmsServiceSpy: jasmine.SpyObj<FilmsService>;

beforeEach(async(() => {
const spy = jasmine.createSpyObj('FilmsService',
['searchFilmByID']
);

TestBed.configureTestingModule({
declarations: [ FilmOverviewComponent ],
providers: [
{provide: AppTitleService, useValue: {getTitle: () => 'title'}},
{provide: ActivatedRoute, useValue: {params: of({id: 123})} },
{provide: FilmsService, useValue: spy}
]
})
.compileComponents();

filmsServiceSpy = TestBed.get(FilmsService);
}));

beforeEach(() => {
filmsServiceSpy.searchFilmByID.and.returnValue(Observable.create([{title: "", year: ""}]));
fixture = TestBed.createComponent(FilmOverviewComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});

服务中使用的方法:

searchFilmByID(movieID: string): Observable<Film> {
return this.http.get<Film>(this.getUrlWithID(movieID));
}

private getUrlWithID(movieID: string) {
return 'api/externalfilms/film/' + movieID;
}

我不知道如何解决这个问题。我怀疑它会通过某种模拟订阅方法来解决,但我完全失败了。

提前感谢您的帮助!

最佳答案

错误来自 this.http.get<Film>... .有两种方法可以解决。

第一种方式——模拟http客户端服务并调用fake

describe('FilmOverviewComponent', () => {
let component: FilmOverviewComponent;
let fixture: ComponentFixture<FilmOverviewComponent>;

let filmsService: FilmsService;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FilmOverviewComponent ],
imports: [ HttpClientTestingModule ],
providers: [
{provide: AppTitleService, useValue: {getTitle: () => 'title'}},
{provide: ActivatedRoute, useValue: {params: of({id: 123})} },
FilmsService
]
})
.compileComponents();
}));

beforeEach(() => {
filmsService = TestBed.inject(FilmsService);

/* Mock response */
const httpClient: HttpClient = TestBed.inject(HttpClient);
spyOn(httpClient, 'get').and.callFake(() => of({title: "", year: ""}));

fixture = TestBed.createComponent(FilmOverviewComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});

第二种方式——调用假服务方法

const FilmsServiceStub = jasmine.createSpyObj('FilmsService', ['searchFilmByID']);

describe('FilmOverviewComponent', () => {
let component: FilmOverviewComponent;
let fixture: ComponentFixture<FilmOverviewComponent>;

let filmsService: FilmsService;

beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FilmOverviewComponent ],
providers: [
{provide: AppTitleService, useValue: {getTitle: () => 'title'}},
{provide: ActivatedRoute, useValue: {params: of({id: 123})} },
{provide: FilmsService, useValue: FilmsServiceStub}
]
})
.compileComponents();
}));

beforeEach(() => {
filmsService = TestBed.inject(FilmsService);

/* Mock response */
spyOn(filmsService, 'searchFilmByID').and.callFake(() => of({title: "", year: ""}));

fixture = TestBed.createComponent(FilmOverviewComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});

关于javascript - Angular 9 测试组件依赖于可观察的服务 - 无法读取未定义的属性 'subscribe',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62713828/

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