如何使用NgReduxTestingModule

时间:2017-07-04 15:17:18

标签: angular unit-testing redux

我想使用MockNgRedux模拟商店。我将它导入我的测试套件

import { NgReduxTestingModule, MockNgRedux } from '@angular-redux/store/testing';

然后我把它放在configureTestingModule imports。

在测试用例中,已创建示例对象并将其传递给我想要检查的函数。由于与商店一起行动是异步行动 - 我使用了fakeAsync区域,并调用了tick和detectChanges()。虽然我在Observable变量上使用了subscribe(),它应该由商店更新 - 应用程序并没有达到这种方法的主体。

我错了什么?请帮忙。这是我的考验:

it('should has specified version after calling changeVersion', fakeAsync(() => {

    let inputVersion: Version = new Version(); 
    inputVersion.id = 7;
    inputVersion.majorVersion = 1;
    inputVersion.minorVersion = 4;
    inputVersion.createdAt = new Date(2017, 6, 4);
    inputVersion.createdBy = "user1";

    component.changeVersion(inputVersion);

    console.log(MockNgRedux.mockInstance);

    fixture.detectChanges();
    tick();
    fixture.detectChanges();

    console.log(MockNgRedux.mockInstance.getState()); //it's null

    let currentVersion: Version;

    component.selectedVersion$.subscribe((ver: Version) => {
      fixture.detectChanges();
      currentVersion = ver;
    });

    expect(currentVersion.id).toBe(7);
 }));

1 个答案:

答案 0 :(得分:0)

我假设您的组件属性selectedVersion$装饰有@select装饰器。

在测试中,您需要告诉MockNgRedux实例您希望在测试中存根什么值,例如

const selectedVersionStub = MockNgRedux.GetSelectedStub<IState, Version>(["path", "to", "version"]);
selectedVersionStub.next(new Version());
selectedVersionStub.complete();

component.selectedVersion$.toArray().subscribe(versions => {
    expect(versions.length).toBe(1);
});

其中IState是您的州的根类型,而您的版本的路径是您感兴趣的项目的对象遍历路径。此外,我建议使用async而不是fakeAsync ...它会等到所有异步任务完成后再评估您的期望。注意:在这种情况下,selectedVersionStub是rxjs/Subject<Version>类型,因此您可以使用next抽取值,并使用complete关闭观察值,以便toArray()正常工作。

修改:您可以使用getInstance()监视getState方法,但这只适用于您实际注入NgRedux的情况进入你的组件并实际调用getState方法。使用@select进行装饰不会以同样的方式起作用。