首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >隔离组件之间的共享存根

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

Stack Overflow用户
提问于 2019-11-05 00:21:16
回答 2查看 82关注 0票数 0

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

我使用扩展操作符来定义我的serviceStub,每次都使用一个新的引用,但似乎还不够。

代码语言:javascript
运行
复制
export const myserviceStub = {
  ...{
    function1() {},
    propertyA: new BehaviorSubject(false),
  }
};

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

代码语言:javascript
运行
复制
providers: [
        { provide: myService, useValue: myserviceStub },

我期望myServiceStub按照我的文件中的定义,而不是依赖于单元测试的顺序。

EN

回答 2

Stack Overflow用户

发布于 2019-11-05 01:53:21

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

要获得不同的引用,您可以在提供程序上使用useFactory,并在共享存根文件中声明存根工厂:

代码语言:javascript
运行
复制
export const myserviceStub = {
  function1() {},
  propertyA: new BehaviorSubject(false)
};

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

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

代码语言:javascript
运行
复制
providers: [
   { provide: myService, useFactory: myserviceStub }
]

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

代码语言:javascript
运行
复制
export function myServiceStubFactory() {
  return { 
    ...myserviceStub,
    propertyA: new BehaviorSubject(false)
  };
}

所以,总而言之,最好只使用一个工厂,而不是固定的对象,并在工厂返回方法中定义整个对象

票数 1
EN

Stack Overflow用户

发布于 2019-11-05 18:17:34

谢谢你的回答。我最终找到了一种方法,使用Object.create()来获得一个新的引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58697354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档