Javascript 在不使用装饰器的情况下扩展类

Javascript 在不使用装饰器的情况下扩展类,javascript,typescript,decorator,Javascript,Typescript,Decorator,我想参加考试 @stubOnTest('CategorizationServiceStub') class CategorizationService { ... 存根类 import CategorizationService from '../../server/services/CategorizationService'; export default class CategorizationServiceStub extends CategorizationService {

我想参加考试

@stubOnTest('CategorizationServiceStub')
class CategorizationService {
 ...
存根类

import CategorizationService from '../../server/services/CategorizationService';

export default class CategorizationServiceStub extends CategorizationService {
 ....
decorator“捕获”对
CategorizationService
的调用,并将其替换为mock

export default function stubOnTest(stubbedClassStr: string) {
  const pathToStubbedClass = path.resolve(__dirname, stubsDir, stubbedClassStr);
  const stubbedClass = require(pathToStubbedClass);
  ...
但是当调用
CategorizationServiceStub
时,它扩展了调用decorator
@stubOnTest('CategorizationServiceStub')
CategorizationService

然后它变成了一个无止境的循环


有没有办法避免这种情况?

stubOnTest
检查它正在存根的类是否已经存根。可能会向基类上不存在的子类添加属性,如
stubbed=true
。只是一个观察,但装饰一个类以便可以对其进行测试或stubbed以测试另一个系统似乎是一个有问题的设计。put
const stubbedClass=require(pathToStubbedClass)
Promise.resolve()中的
stubOnTest
中的每个后续任务。然后(…)
处理.nextTick(…)
,以便在模块导出其成员后执行。这将打破我建议的使CategorizationServiceStub.ts导出一个函数的循环,该函数由装饰程序使用原始类调用,并返回stub类。它不应该
导入
分类服务
(这会导致循环引用)只是一些上下文:我想全局模拟使用Cypress测试的一些服务。该服务在其他服务、控制器等中调用,而不是在一个地方调用。我正试图找到一种“全球”模仿它的方式。即,如果在节点_ENV测试中,它将使用模拟版本。类似于Rails的东西会执行载波(在测试中写入磁盘,在prod中使用S3)。让
stubOnTest
检查它正在存根的类是否已经存根。可能会向基类上不存在的子类添加属性,如
stubbed=true
。只是一个观察,但装饰一个类以便可以对其进行测试或stubbed以测试另一个系统似乎是一个有问题的设计。put
const stubbedClass=require(pathToStubbedClass)
Promise.resolve()中的
stubOnTest
中的每个后续任务。然后(…)
处理.nextTick(…)
,以便在模块导出其成员后执行。这将打破我建议的使CategorizationServiceStub.ts导出一个函数的循环,该函数由装饰程序使用原始类调用,并返回stub类。它不应该
导入
分类服务
(这会导致循环引用)只是一些上下文:我想全局模拟使用Cypress测试的一些服务。该服务在其他服务、控制器等中调用,而不是在一个地方调用。我正试图找到一种“全球”模仿它的方式。即,如果在节点_ENV测试中,它将使用模拟版本。类似于Rails的东西会产生载波(在测试中写入磁盘,在prod中使用S3)。