服务状态不能在组件的单元测试 jasmine 中改变

问题描述 投票:0回答:1

我有一个组件从服务中消耗资源。

export class BarService {
age: string = '';
private dare$ = new BehaviorSubject<boolean>(false);
delete() {
  throw new Error('Delete');
}
dare = this.dare$.asObservable();

setDare(flag: boolean) {
  this.dare$.next(flag);
}

getVision() {
  //some http call 
  return of({ name: 'Andrew' });
}
//some http call 
getVisions = of({ name: 'ion' });
}

在组件中什么消费了这个服务。

 ...
  ngOnInit() {
this._bar.getVisions
  .pipe(
    switchMap(() => this._bar.getVision()),
    tap((value: any) => (this.dare = value.name)),
    catchError((err) => {
      this.error = true;
      console.log(err);

      return EMPTY;
    })
  )
  .subscribe(console.log);
}
 ...

在我的测试中

  beforeEach(() => {
barService = jasmine.createSpyObj(
  'BarService',
  {
    getVision: of('Ion'),
  },
  {
    getVisions: getError(),
    age: '41',
    dare: of({}),
  }
);
TestBed.configureTestingModule({
  declarations: [BarComponent],
  providers: [
    ...
    { provide: BarService, useValue: barService },
  ],
}).compileComponents();

fixture = TestBed.createComponent(BarComponent);
component = fixture.componentInstance;
});

在这里你会找到一个在 stackblitz 中创建的基准

如何在不同的 IT 中将这 2 个可观察对象的状态更改 3 次。我设法改变了它们,但问题是我无法找到我发现的一致性:有时它以一种方式工作,有时它以不同的方式工作。请帮助那些对茉莉花有更多经验的人:-)

angular typescript rxjs jasmine karma-runner
1个回答
0
投票

您的

stackblitz
链接似乎已损坏。

要更改可观察值的值,我会使用

BehaviorSubject
。像这样的东西:

let barService: BarService;
// Declare behavior subjects
getVisionSubject = new BehaviorSubject<string>('Ion');
dareSubject = new BehaviorSubject<any>({});
...
 // Assign behavior subjects to the spies
 beforeEach(() => {
  barService = jasmine.createSpyObj(
  'BarService',
  {
    getVision: getVisionSubject.asObservable(),
  },
  {
    getVisions: getError(),
    age: '41',
    dare: dareSubject.asObservable(),
  }
);
...
// change them in tests
it('abc', () => {
  getVisionSubject.next('blah');
  dareSubject.next({ a: 1 });
  ...
});

it('def', () => {
  getVisionSubject.next('yada');
  dareSubject.next({ b: 2 });
  ...
});
© www.soinside.com 2019 - 2024. All rights reserved.