gpt4 book ai didi

Angular 7 单元测试 Observable 订阅调用

转载 作者:行者123 更新时间:2023-12-05 02:11:55 25 4
gpt4 key购买 nike

我的 Angular 应用程序中有一个 GeoLocationService

import { Injectable } from "@angular/core";
import { Observable } from "rxjs/Observable";

@Injectable()
export class GeoLocationService {
coordinates: any;

constructor() {}

public getPosition(): Observable<Position> {
return Observable.create(observer => {
navigator.geolocation.watchPosition((pos: Position) => {
observer.next(pos);
}),
() => {
console.log("Position is not available");
},
{
enableHighAccuracy: true
};
});
}
}

我想对该服务进行单元测试,以确保 getPosition() 函数返回一个有效的 Observable。这是我的测试的样子。

import { TestBed, fakeAsync } from "@angular/core/testing";

import { GeoLocationService } from "./geo-location.service";
import { take } from "rxjs/operators";

describe("GeoLocationService", () => {
let service: GeoLocationService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [GeoLocationService]
});
service = TestBed.get(GeoLocationService);
});


it("should get observable value", fakeAsync((done: DoneFn) => {
service
.getPosition()
.subscribe(value => {
expect(value.coords).not.toBeUndefined();
expect(value.coords).not.toBeNaN();
expect(value.coords).not.toBeNull();
done();
});
}));
});

这里发生的是,一旦我运行测试,测试就成功了(这是因为测试中的 subscribe block 尚未运行)。在打开的chrome浏览器窗口上(在karma中查看测试结果),我选择允许让应用程序找到我的位置,此时 subscribe block 运行,但到那时 it 规范已经完成,由于这个原因我得到一个 console error 说。

未捕获错误:在没有当前规范时使用了“expect”,这可能是因为异步测试超时

我不知道执行此测试的推荐方法是什么。

最佳答案

我能够使用以下代码让它工作。

  it("should get current user coordinates", (done: DoneFn) => {
let position: any;
service.getPosition().subscribe(value => {
position = value;
expect(position.coords).not.toBeUndefined();
expect(position.coords).not.toBeNaN();
expect(position.coords).not.toBeNull();
done();
});
});

为此,测试一直等到您允许 浏览器窗口获取您的位置。如果等待时间过长,则会抛出超时错误。足以让我测试我想要的东西。

关于Angular 7 单元测试 Observable 订阅调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56849566/

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