繁体   English   中英

如何匹配 Jasmine 中的 TypeScript 可选参数?

[英]How to match TypeScript optional parameter in Jasmine?

我正在重构 TypeScript 方法以添加具有默认值的可选参数。 重构方法是核心操作,调用核心函数的高级操作有很多。 预先存在的调用省略了新参数(因此使用默认值),而新的和重构的方法提供了新的参数值。 简化版本如下所示:

export class Scratch {
  coreOperation(mainArg: string, option: boolean = false) {
    // ...
  }

  private midLevelOperation(mainArg: string) {
    this.coreOperation(mainArg + '1');
  }

  highLevelOperation1(mainArg: string) {
    this.midLevelOperation(mainArg);
    this.coreOperation(mainArg + '2', true);
  }
}

我还在更新更高级别操作的 Jasmine 测试。 我想断言高级操作会导致使用某些参数调用核心操作。 测试大致如下所示:

describe('Scratch', () => {
  let objectUnderTest: Scratch;

  beforeEach(() => {
    objectUnderTest = new Scratch();
    spyOn(objectUnderTest, 'coreOperation');
  });

  describe('highLevelOperation1', () => {
    it('should call core operation', () => {
      objectUnderTest.highLevelOperation1('main');
      expect(objectUnderTest.coreOperation).toHaveBeenCalledWith('main1', false);
      expect(objectUnderTest.coreOperation).toHaveBeenCalledWith('main2', true);
    });
  });
});

问题是 Jasmine 的toHaveBeenCalledWith不知道第二个参数有默认值。 上述代码的错误:

  - Expected spy coreOperation to have been called with:
    [ 'main1', false ]
  but actual calls were:
    [ 'main1' ],
    [ 'main2', true ].

显然,我可以通过从测试中删除false参数来通过测试。 但我不希望测试知道调用站点是使用 1 个参数还是 2 个参数,尤其是来自像这个示例这样的私有库函数。

有没有办法编写一个在省略可选参数和传递默认值时都可以工作的 Jasmine 匹配器?

不幸的是,没有办法监视 Jasmine 中的默认/可选参数。

这是不可能的,有几个原因:

  1. 默认参数设置在调用方法范围内的arguments数组变量中,它们不是传递给参数的实际值。
  2. toHaveBeenCalledWith只能测试调用该方法的参数,而不是该方法决定将其缺少的参数默认为哪些值。

要解决此问题,您可以将目标方法包装在另一个包含option: boolean = false默认参数。 然后您应该能够检查调用coreOperation的内容:

coreOperation(mainArg: string, option: boolean) {
  // ...
}

private coreOperationDefaultWrapper(mainArg: string, option: boolean = false) {
  this.coreOperationmainArg(mainArg, option);
}

值得注意的是,最好的测试是测试应用程序做了什么而不是测试它是如何编写的。 因此,我强烈建议练习测试默认参数会导致什么行为的心态,而不是检查它们实际上是什么。 当然这并不总是可能的,我希望上面的例子可以帮助你! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM