Angular 角度重复/存储-@选择可观测值&;在同一规范文件中的单元测试之间共享存根

Angular 角度重复/存储-@选择可观测值&;在同一规范文件中的单元测试之间共享存根,angular,unit-testing,jasmine,redux,angular-cli,Angular,Unit Testing,Jasmine,Redux,Angular Cli,我有一个通过Angular CLI创建的项目,它通过库使用redux。在为连接到redux状态的组件编写单元测试时,我注意到一个奇怪的行为。似乎spec文件中的第一个测试正在创建可观察的对象,而第一个测试之后的任何后续测试都使用相同的可观察对象,并且无法清除。这导致了一些问题: 如果第一个测试没有将选择器剔除,则后续测试中对可观察对象的任何订阅都不会完成/发出值。这会导致Jasmine异步超时 如果第一个测试对选择器执行了存根,则该存根将用于所有后续测试,并且不能被覆盖。但此时订阅将发出一个值

我有一个通过Angular CLI创建的项目,它通过库使用redux。在为连接到redux状态的组件编写单元测试时,我注意到一个奇怪的行为。似乎spec文件中的第一个测试正在创建可观察的对象,而第一个测试之后的任何后续测试都使用相同的可观察对象,并且无法清除。这导致了一些问题:

  • 如果第一个测试没有将选择器剔除,则后续测试中对可观察对象的任何订阅都不会完成/发出值。这会导致Jasmine异步超时
  • 如果第一个测试对选择器执行了存根,则该存根将用于所有后续测试,并且不能被覆盖。但此时订阅将发出一个值
以下是我的组件代码

import { Component } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { select } from '@angular-redux/store';
import memberSelectors from './member-search.selectors';

    @Component({
  selector: 'app-member-summary-container',
  template: `<app-member-summary [subscriber]="(subscriber$ | async)"></app-member-summary>`
})
export class MemberSummaryContainer {
  @select(memberSelectors.getSelectedMemberDetails) readonly subscriber$: Observable<any>;
}
从'@angular/core'导入{Component};
从“rxjs/Observable”导入{Observable};
从'@angular redux/store'导入{select};
从“./member search.selectors”导入成员选择器;
@组成部分({
选择器:“应用程序成员摘要容器”,
模板:``
})
导出类MemberSummaryContainer{
@选择(memberSelectors.getSelectedMemberDetails)只读订户$:可观察;
}
以下是我的单元测试代码:

import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MockNgRedux, NgReduxTestingModule } from '@angular-redux/store/testing';

import { MemberSummaryContainer } from './member-summary.container';
import { IMember } from './member-search.reducer';
import memberSearchSelectors from './member-search.selectors';

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

  const subscriber: IMember = {
    firstName: 'John',
    lastName: 'Doe',
  };

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ MemberSummaryContainer ],
      imports: [NgReduxTestingModule],
      schemas: [CUSTOM_ELEMENTS_SCHEMA]
    })
    .compileComponents();

    MockNgRedux.reset();
  }));

  it('should be created', () => {
    fixture = TestBed.createComponent(MemberSummaryContainer);
    component = fixture.componentInstance;
    fixture.detectChanges();

    expect(component).toBeTruthy();
  });

  it('should get the selected member from state', done => {
    const memberStub = MockNgRedux.getSelectorStub(memberSearchSelectors.getSelectedMemberDetails);
    memberStub.next(subscriber);
    memberStub.complete();

    fixture = TestBed.createComponent(MemberSummaryContainer);
    component = fixture.debugElement.componentInstance;
    fixture.detectChanges();

    component.subscriber$.subscribe(
      actualSequence => { expect(actualSequence).toEqual(subscriber); },
      null,
      done
    );
  });
});
从'@angular/core'导入{CUSTOM_ELEMENTS_SCHEMA};
从“@angular/core/testing”导入{async,ComponentFixture,TestBed};
从“@angular-redux/store/testing”导入{MockNgRedux,NgReduxTestingModule};
从“./member summary.container”导入{MemberSummaryContainer};
从“./member search.reducer”导入{IMember};
从“./member search.selectors”导入memberSearchSelectors;
描述('MemberSummaryContainer',()=>{
let组件:MemberSummaryContainer;
let夹具:组件夹具;
常量订户:IMember={
名字:“约翰”,
姓氏:“Doe”,
};
beforeach(异步(()=>{
TestBed.configureTestingModule({
声明:[MemberSummaryContainer],
导入:[NgReduxTestingModule],
模式:[自定义元素\u模式]
})
.compileComponents();
MockNgRedux.reset();
}));
它('应该创建',()=>{
fixture=TestBed.createComponent(MemberSummaryContainer);
组件=fixture.componentInstance;
fixture.detectChanges();
expect(component.toBeTruthy();
});
它('should get the selected member from state',done=>{
const memberStub=MockNgRedux.getSelectorStub(memberSearchSelectors.getSelectedMemberDetails);
memberStub.next(订户);
memberStub.complete();
fixture=TestBed.createComponent(MemberSummaryContainer);
组件=fixture.debugElement.componentInstance;
fixture.detectChanges();
component.subscriber$.subscribe(
actualSequence=>{expect(actualSequence).toEqual(订户);},
无效的
完成
);
});
});
选择器getSelectedMemberDetails是一个简单的选择器,因此没有任何导致任何问题的疯狂逻辑

所以问题是,我做错了什么?我试着模仿angular redux/store的示例应用程序中正在做的事情,但有些事情并没有按预期工作


谢谢大家!

你好,我问了一个类似的问题:。你有没有找到一个解决办法来解决这种奇怪的MockNgRedux行为?谢谢