该Component有5个依赖:为了修复bug,我需要引入结账服务和购物车服务。如果直接注入到构造函数中,这实际上是对构造函数签名的修改,根据Spartacus编程规范,这是引入breakingchange——majorchanges。但是我们观察到Component类的依赖之一,checkoutDeliveryService,有结账服务和购物车服务。这样我们就可以把代码移到checkoutDeliveryService中去写,这样DeliveryComponent中就不会引入依赖了。我们分析上面的CheckoutDeliveryService类,它有5个依赖,两个store,存储状态信息,三个服务类:ActiveCartServiceUserIdServiceCheckoutService以ActiveCartService为例:使用如下代码:使用Partial方法,您可以只实现ActiveCartService的某些方法。TestBed用于创建待测组件和依赖:上图中的TestBed.configureTestingModule只是第一步,在第82、83、84行需要调用TestBed.inject方法注入provide后的方法名上图,并返回注入的类例子:看下图的单元测试代码:inject接受两个参数,第一个参数类型是一个数组,里面存放的是注入的token,这个例子是checkoutDeliveryService,第二个参数是一个函数,这个函数包含业务逻辑,入参是要注入第一个参数token数据的内容。调用该函数时,输入参数token包含AngularDI框架注入的实例。这种用法与SAPUI5异步加载库依赖项的方式非常相似。由于Ngrxstore依赖mocks,我们需要在T??estBed.configureTestingModule的imports区域维护StoreModule.forRoot和forFeature返回的真实数据。然后调用TestBed.inject(Store),再调用该方法返回的实例的dispatch方法,将测试数据插入到store中。getSupportedDeliveryModes方法会在内部调用loadSupportedDeliveryModes,所以使用spyOn方法可以监控后者是否被调用。一旦调用服务的setDeliveryMode方法,就会触发store.dispatch操作,所以loading标志会被设置为true。比如reset方法会调用底层的store.dispatch操作,传入一个ResetSetDeliveryModeProcess动作。此呼叫也可以被监控。更多Jerry原创文章在这里:《王子熙》:
