模拟 Subject 的 return 值 - 使用 Jasmine 进行单元测试

Mocking a return value for a Subject - Unit Testing with Jasmine

我正在进行单元测试,部分测试有一个主题。我是 Subjects 的新手,了解它们如何工作的一般要点,但我正在努力模拟一个 return 值。我尝试了各种方法,希望能找到正确的方法,比如使用间谍和 returnvalue 到 return 数字 3.

在组件中:

.... 
private searchEvent: Subject<string> = new Subject<string>();

....
      this.searchEvent.pipe(debounceTime(500)).subscribe(value => {
        if (value.length >= 3) {
          this.retrieveAssets(value);
        }
      })
....

在我的规范文件中,我基本上有:

        component['searchStockEvent'].subscribe(x=> of(3));

        fixture.whenStable().then(() => {
          expect(component['retrieveAssets']).toHaveBeenCalled();
        });

searchEvent 是私有的将很难直接在主题上调用 next,因此您必须找到一种方法来使 searchEvent 发出大于 3 的值并走这条路。

对于这个演示,我们将制作它 public:

.... 
public searchEvent: Subject<string> = new Subject<string>();

....
      this.searchEvent.pipe(debounceTime(500)).subscribe(value => {
        if (value.length >= 3) {
          this.retrieveAssets(value);
        }
      })
....
import { fakeAsync, tick } from '@angular/core/testing';
it('should call retrieve assets', fakeAsync(() => {
  component.searchEvent.next(3);
  // we need to pass 501ms in a fake way
  tick(501);
  expect(component.retreiveAssets).toHaveBeenCalled();
}));