angular - NGXS:测试调度 Action 不适用于 ofActionDispatched

标签 angular unit-testing jasmine store ngxs

我正在尝试测试 Action 调度,但它在我的测试中不起作用... 组件表现良好, Action 被调度,但 actions$.pipe 没有捕捉到 Action ,因此无法在测试中检查。

代码:

describe('ResponsiveService', () => {
  let store, actions$;
  const observableMediaMock = {
    subscribe : (callback: (change: MediaChange) => void) => { 
      this.callback = callback 
    },
    triggerMediaChange: (change: MediaChange) => this.callback(change)
  };
  beforeEach(() => {
    TestBed.configureTestingModule({
        imports: [
            FlexLayoutModule,
            NgxsModule.forRoot([MediaState])
        ],
        providers: [ResponsiveService, { provide: ObservableMedia, useValue: observableMediaMock }]
    });
    store = TestBed.get(Store);
    actions$ = TestBed.get(Actions);
  });

  it('should be created', inject([ResponsiveService], (service: ResponsiveService) => {
    expect(service).toBeTruthy();
  }));

  it("should send get request", function(done) {
    inject([ResponsiveService], (service: ResponsiveService) => {
      const mediaQueryValue = 'mediaQuery',
            mqAliasValue = 'mqAlias',
            suffixValue = 'suffix';

      actions$.pipe(ofActionDispatched([MediaChanged]))
      .subscribe(({payload}) => {
        expect(payload).toBeTruthy();
        expect(payload.mediaQuery).toEqual(mediaQueryValue);
        done();
      });
      service.init();

      observableMediaMock.triggerMediaChange(new MediaChange(null, mediaQueryValue, mqAliasValue, suffixValue));
    })(); // function returned by 'inject' has to be invoked
  });
});

谢谢!

最佳答案

将您的测试更新为以下内容:

it("should send get request", async( () => {
  inject([ResponsiveService], (service: ResponsiveService) => {
  const mediaQueryValue = 'mediaQuery',
        mqAliasValue = 'mqAlias',
        suffixValue = 'suffix';

  actions$.pipe(ofActionDispatched(MediaChanged))
  .subscribe(({payload}) => {
    expect(payload).toBeTruthy();
    expect(payload.mediaQuery).toEqual(mediaQueryValue);
  });
  service.init();

  observableMediaMock.triggerMediaChange(new MediaChange(null, mediaQueryValue, mqAliasValue, suffixValue));
  })(); // function returned by 'inject' has to be invoked
}));

ofActionDispatched 不将列表作为输入,但评分者采用项目列表,例如:ofActionDispatched(MediaChanged, SomeOtherAction)

您还应该能够删除 done 函数并将测试包装在普通的 async block 中。希望这会有所帮助,但不确定我是否正确打开和关闭了所有括号。

关于angular - NGXS:测试调度 Action 不适用于 ofActionDispatched,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53502991/

相关文章:

angular - 如何在 PhpStorm/WebStorm 中调试 angular2 种子项目?

javascript - 正则表达式接受正数和负数

node.js - 执行新应用程序时出现 Angular 7 错误,错误 : Cannot find module 'temp' ,

javascript - 代码拆分 `import` 破坏了 Jest 测试

angularjs - 在 ionic 单元测试中广播意外的 $locationChangeStart 和 $locationChangeSuccess 事件

javascript - 异步 Jasmine 测试在操作之前不会调用 beforeEach()

javascript - 当 onClick 激活时,如何从组件调用的 javascript 函数中捕获值

java - 是否有一些方法在没有在模拟上调用的方法的情况下无法被 Mockito 模拟?

unit-testing - OCMock期望和 stub 方法有什么区别?

javascript - AngularJS Jasmine 测试谷歌地图 : offsetWidth is null