Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了单元测试 – 我是否需要在单元测试中取消订阅订阅?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有如下测试:

it('should return some observable',async(() => {
  mockBACkend.connections.subscribe((mockConnection: mockConnection) => {
    const responSEOptions = new ResponSEOptions({
      body: JSON.Stringify(/* some response */)
    });

    mockConnection.mockRespond(new Response(responSEOptions));
  });

  service.getSomeObservable()
    .subscribe(result => {
      expect(result).toBe(/* expected response */);
    });
}));

我是否需要在afterEach或afterAll块中取消订阅以避免内存问题?还是会被自动删除

解决方法

@estus是正确的,你不需要取消订阅.

TL;博士;

> Observables / Subjects对所有订阅者持有引用,直到完成.
>无法将具有活动引用的对象标记垃圾收集.基本的Js.
> http Observables确实完成了当时的订阅,并为GC释放了它们.
>在Observable / Subject被拆除或完成之前,除非您取消订阅,否则不能进行GC订阅.

虑一下这个简单的Angular TESTBed设置:

describe(`Dataservice`,() => {
  let service: Dataservice;
  let httpmock: httpTesTingController;

  beforeEach(() => {
    TESTBed.configureTesTingModule({
      imports: [httpClientTesTingModule],providers: [
        Dataservice,]
    });

    service = TESTBed.get(DataservicE);
    httpmock = TESTBed.get(httpTesTingController);
  });

  it(`should get a response`,() => {
    service.getData().subscribe(response => {
      expect(responsE).toBeTruthy();
    });
  });

在通过Angular httpClient发出http请求的情况下,Observable将完成,并且将为GC发布对Subscribers的引用.对于如上所示的一般Angular Jasmine测试 – 即使你有一个Observable没有完成 – 服务引用的Dataservice对象每次调用之前都会被重置,而旧的Dataservice对象将全部丢失引用并标记为GC.一旦发生这种情况,Dataservice中Observable / Subject引用的任何订阅都将丢失对它们的引用,并且它们也将被GC.

请记住,Observables会发生内存泄漏,因为它们会保留对所有订阅服务器的引用,除非订阅服务器取消订阅.它们将继续具有对它们及其包含函数的有效引用,并且在Subject / Observable被销毁之前不能标记为GC.如果主题继续存在并且您不断添加订阅者(例如同一订阅​​者的新实例),您将继续向内存中添加一堆旧的未使用的对象.

大佬总结

以上是大佬教程为你收集整理的单元测试 – 我是否需要在单元测试中取消订阅订阅?全部内容,希望文章能够帮你解决单元测试 – 我是否需要在单元测试中取消订阅订阅?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。