隔离组件之间的共享存根

时间:2019-11-04 16:21:16

标签: angular typescript jasmine

我正在一个单独的.ts文件中定义服务的存根,该文件在多个组件中使用(这避免了我在每个组件中定义相同的存根)。 问题在于它会导致随机单元测试,因为当组件修改存根的属性时,将使用该存根的下一个组件将受到影响。

我正在使用spread运算符定义我的serviceStub,以便每次都使用一个新引用,但这似乎还不够。

export const myserviceStub = {
  ...{
    function1() {},
    propertyA: new BehaviorSubject(false),
  }
};

并在带有测试床的beforeEach中使用此存根:

providers: [
        { provide: myService, useValue: myserviceStub },

我希望myServiceStub与文件中定义的一样,而不取决于单元测试的顺序。

2 个答案:

答案 0 :(得分:1)

您应该将对象视为不可变的,在单独文件中的常量定义中使用传播运算符不会阻止您更改对象的内部引用。每次导入此const时,它将始终使用相同的引用。

要获取其他参考,可以在提供程序上使用useFactory并在共享存根文件中声明存根工厂:

export const myserviceStub = {
  function1() {},
  propertyA: new BehaviorSubject(false)
};

export function myServiceStubFactory() {
  return { ...myserviceStub };
}

然后您可以像这样提供它:

providers: [
   { provide: myService, useFactory: myserviceStub }
]

但是,它仍将共享propertyA上定义的BehaviorSubject,要更改此设置,您必须更新工厂:

export function myServiceStubFactory() {
  return { 
    ...myserviceStub,
    propertyA: new BehaviorSubject(false)
  };
}

总而言之,最好一起使用工厂,而不使用固定对象,然后在工厂返回方法中定义整个对象

答案 1 :(得分:0)

感谢您的回答。 我终于找到了一种使用Object.create()的方法来获得新的引用。