Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 隔离组件之间的共享存根_Angular_Typescript_Jasmine - Fatal编程技术网

Angular 隔离组件之间的共享存根

Angular 隔离组件之间的共享存根,angular,typescript,jasmine,Angular,Typescript,Jasmine,我在一个单独的.ts文件中定义服务存根,该文件在多个组件中使用(这避免了我在每个组件中定义相同的存根)。 问题是它会导致随机单元测试,因为当一个组件修改存根的属性时,将使用该存根的下一个组件将受到影响 我正在使用spread操作符定义我的serviceStub,以便每次都使用一个新引用,但似乎还不够 export const myserviceStub = { ...{ function1() {}, propertyA: new BehaviorSubject(false)

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

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

export const myserviceStub = {
  ...{
    function1() {},
    propertyA: new BehaviorSubject(false),
  }
};
并将此存根用于具有以下各项的Beforeach试验台:

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

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

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

要获取不同的引用,可以使用提供程序上的
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)
  };
}
因此,总而言之,最好是同时使用工厂,而不是固定对象,并在工厂返回方法中定义整个对象

谢谢您的回答。 我终于找到了一种方法,使用Object.create()创建一个新的引用