gpt4 book ai didi

javascript - 测试 Angular 可观察对象是否发出值或序列

转载 作者:行者123 更新时间:2023-11-30 11:10:45 25 4
gpt4 key购买 nike

我有一项服务可以创建发射值的可观察对象,测试发射值是否符合预期相对容易。

例如:

describe('service', () => {
beforeEach(() => {
TestBed.configureTestingModule({providers: [MyService]});
});

it('should emit true', async(() => {
const service = TestBed.get(MyService);
service.values$.subscribe((value) => expect(value).toBeTruthy());
}));
});

以上内容用于测试预期值,但它仅在服务实际发出值时才有效。如果您遇到服务无法发出值的边缘情况,那么测试本身实际上会通过并且 Jasmine 会记录警告消息“SPEC HAS NO EXPECTATIONS should be created”。

我在 Google 上搜索了一段时间,试图弄清楚如何将这种情况视为错误,并提出了这种方法。

    it('should emit true', async(() => {
const service = TestBed.get(MyService);
let value;
service.values$.subscribe((v) => value = v);
expect(value).toBeTruthy();
}));

以上仅适用于同步 observables,对我来说感觉像是代码味道。其他开发人员会看到这一点并认为这是一个质量很差的测试。

于是想了几天。我想到了使用 takeUntil() 强制 observable 完成,然后测试预期结果。

例如:

describe('service', () => {
let finished: Subject<void>;

beforeEach(() => {
TestBed.configureTestingModule({providers: [MyService]});
finished = new Subject();
});

afterEach(() => {
finished.next();
finished.complete();
});

it('should emit true', async(() => {
const service = TestBed.get(MyService);
let value;
service.changes$
.pipe(
takeUntil(finished),
finalize(() => expect(value).toBeTruthy())
)
.subscribe((v) => value = v);
}));
});

在上面的示例中,值存储在局部变量中,然后在可观察对象完成时检查预期结果。我通过使用 afterEach()takeUntil() 强制完成。

问题:

我的方法是否有任何副作用,如果有,执行这些类型的测试的 Angular/Jasmine 方法是什么?我担心您不应该在 afterEach() 生命周期调用期间执行expect 断言。

最佳答案

这对我来说似乎太过分了。

Jasmine 在其测试中提供了回调,您可以简单地使用它吗?

it('should X', doneCallback => {
myObs.subscribe(res => {
expect(x).toBe(y);
doneCallback();
});
});

如果没有调用回调,测试将失败并出现超时异常(意味着在这次失败后将不再运行测试)

关于javascript - 测试 Angular 可观察对象是否发出值或序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53834288/

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