如何在茉莉花单元测试中触发ngxsAfterBootstrap



在我的angular应用程序中,我使用NGXS和Jasmine。

在我的一些商店中,我使用ngxsAfterBootstrap作为初始化,在那里我调度一些操作。

我不能使用ngxsOnInit,因为我不知道确切的原因,但我不能从我的RouteState选择器中获取最新的url参数(在ngxsOnInit中总是未定义的,即使我订阅了这些选择器并等待了一些时间(

但是,通过ngxsAfterBootstrap,我得到了这些值。

所以,在我的单元测试中,我想测试这个初始化,但我没有找到任何触发ngxsAfterBootstrap方法的解决方案。

根据NGXS文件(https://www.ngxs.io/advanced/life-cycle),ngxsAfterBootstrap将通过APP_BOOTSTRAP_LISTENER触发,所以我认为这是当我们使用ngModule的"BOOTSTRAP"属性时,该属性在TestBed.configureTestingModule…中不存在

我试图获取我的存储实例,手动调用他的ngxsAfterBootstrap方法,并将StateContext作为参数进行模拟,但很明显,因为StateContext是模拟的,所以当我使用他的调度时,它不会触发我的操作。。。

你知道吗;"干净";解决方案?(这里的clean只是不修改我的实现以使单元测试工作(

Thx!(对不起我英语不好(

编辑:

我最终做了什么:

productStore = TestBed.inject(ProductState);
...
const stateContextMocked = {
getState: jasmine.createSpy(),
setState: jasmine.createSpy(),
patchState: jasmine.createSpy(),
dispatch: jasmine.createSpy(),
} as StateContext<IProduct>;
...
productStore.ngxsAfterBootstrap(stateContextMocked);
...
expect(stateContextMocked.dispatch).toHaveBeenCalledWith(new GetProductAction(productIdMocked));

我以前试过这样做,但我不喜欢,因为我不能使用";真实的";在ngxsAfterBootstrap的参数中自动传递的StateContext对象。

所以,我不知道我的调度结果。

但事实上,我可以测试我的分派方法是否被调用,并进行另一个测试来测试分派的操作本身。

这甚至是一个更好的方法^^

假设我们想要测试ngOnInit。

  1. 在测试的//排列步骤中,我们模拟所有外部依赖项,包括公共组件方法(顺便说一句,组件方法不是强制性的,这取决于我们的方法(
  2. 之后,在//Act中,我们只需调用
component.ngOnInit();
  1. 最后在//断言中,我们预计我们的间谍已经被调用

ngxsAfterBootstrap也有同样的方法,您应该将其视为一个简单的类方法。没有必要把事情搞得过于复杂。

相关内容

  • 没有找到相关文章

最新更新