我想使用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);
}));
答案 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
进行装饰不会以同样的方式起作用。