[英]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 中的默认/可选参数。
这是不可能的,有几个原因:
arguments
数组变量中,它们不是传递给参数的实际值。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.