单元测试 – 我是否需要在单元测试中取消订阅订阅?
如果我有如下测试:
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对所有订阅者持有引用,直到完成. 考虑一下这个简单的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.如果主题继续存在并且您不断添加订阅者(例如同一订阅??者的新实例),您将继续向内存中添加一堆旧的未使用的对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |