Angular 如何测试具有去盎司时间的效果?

Angular 如何测试具有去盎司时间的效果?,angular,rxjs,ngrx,ngrx-effects,Angular,Rxjs,Ngrx,Ngrx Effects,我正在使用NgRx,想测试我的效果。有些效果确实有一个去盎司时间。像这个例子: @Effect()searchImage$=此.actions$.pipe( 类型(来自ImageLibraryActions.SEARCH\u图像), 映射((操作:fromImageLibraryActions.SearchImages)=>action.query), 去BounceTime(300), switchMap(查询:字符串)=>this.imageLibraryService.getImagesB

我正在使用NgRx,想测试我的效果。有些效果确实有一个去盎司时间。像这个例子:

@Effect()searchImage$=此.actions$.pipe(
类型(来自ImageLibraryActions.SEARCH\u图像),
映射((操作:fromImageLibraryActions.SearchImages)=>action.query),
去BounceTime(300),
switchMap(查询:字符串)=>this.imageLibraryService.getImagesBySearching(查询)),
映射((图像:LibraryImage[])=>newfromImageLibraryActions.LoadImages(图像))

如何正确地测试它们。我尝试了以下方法:

describe('SearchImages$', () => {
   it('should return loadImages action', fakeAsync(() => {
        const action = new fromImageLibraryActions.SearchImages('test');
        const images = [
            { uploaderId: 1 } as LibraryImage,
            { uploaderId: 2 } as LibraryImage
        ];

        const loadImagesAction = new fromImageLibraryActions.LoadImages(images);

        actions$ = hot('--a-', { a: action });

        tick(300);
        getTestScheduler().flush();

        const expected = cold('--b-', { b: loadImagesAction });
        expect(effects.searchImage$).toBeObservable(expected);          
   }));
});

ngrx示例应用程序有一个示例,请参阅代码:


更多信息可以在中找到。

ngrx示例不适用于我,因此我创建了它,它解释了如何使用
debounceTime
测试ngrx效果

GitHub上的特定测试,如下所示:

import { TestBed } from '@angular/core/testing';
import { provideMockActions } from '@ngrx/effects/testing';
import { cold, getTestScheduler, hot } from 'jasmine-marbles';
import { Observable } from 'rxjs';
import { loadClients, networkRequest } from './client.actions';

import { ClientEffects } from './client.effects';

describe('ClientEffects', () => {
  let actions$: Observable<any>;
  let effects: ClientEffects;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        ClientEffects,
        provideMockActions(() => actions$)
      ]
    });

    effects = TestBed.inject<ClientEffects>(ClientEffects);
  });

  it('dispatch networkRequest', () => {
    const scheduler = getTestScheduler();
    scheduler.run(() => {
      // marbles
      const actions =  'a 500ms a b';
      const expected = '500ms a - 500ms b';

      actions$ = hot(actions, {
        a: loadClients(),
        b: loadClients(),
      });

      expect(effects.loadClients$).toBeObservable(cold(expected, {
        a: networkRequest(),
        b: networkRequest(),
      }));
    });
  });
});
从'@angular/core/testing'导入{TestBed};
从“@ngrx/effects/testing”导入{provideMockActions};
从“茉莉花大理石”导入{cold,getTestScheduler,hot};
从“rxjs”导入{Observable};
从“/client.actions”导入{loadClients,networkRequest};
从“/client.effects”导入{ClientEffects};
描述('客户效应',()=>{
让动作$:可观察;
let效应:客户效应;
在每个之前(()=>{
TestBed.configureTestingModule({
供应商:[
客户效应,
provideMockActions(()=>actions$)
]
});
效应=试验台。注射(客户效应);
});
它('dispatch networkRequest',()=>{
const scheduler=getTestScheduler();
scheduler.run(()=>{
//弹珠
常量动作='a 500ms a b';
预期常数='500ms a-500ms b';
动作$=热(动作{
a:loadClients(),
b:loadClients(),
});
expect(effects.loadClients$).toBeObservable(cold(expected{
a:networkRequest(),
b:networkRequest(),
}));
});
});
});

debounceTime
将调度程序作为可选的第二个参数,因此您应该使用那里的
TestScheduler
实例。您能给我举个例子吗?
import { TestBed } from '@angular/core/testing';
import { provideMockActions } from '@ngrx/effects/testing';
import { cold, getTestScheduler, hot } from 'jasmine-marbles';
import { Observable } from 'rxjs';
import { loadClients, networkRequest } from './client.actions';

import { ClientEffects } from './client.effects';

describe('ClientEffects', () => {
  let actions$: Observable<any>;
  let effects: ClientEffects;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        ClientEffects,
        provideMockActions(() => actions$)
      ]
    });

    effects = TestBed.inject<ClientEffects>(ClientEffects);
  });

  it('dispatch networkRequest', () => {
    const scheduler = getTestScheduler();
    scheduler.run(() => {
      // marbles
      const actions =  'a 500ms a b';
      const expected = '500ms a - 500ms b';

      actions$ = hot(actions, {
        a: loadClients(),
        b: loadClients(),
      });

      expect(effects.loadClients$).toBeObservable(cold(expected, {
        a: networkRequest(),
        b: networkRequest(),
      }));
    });
  });
});