typescript - 用玩笑测试打字稿中的私有函数
问题描述
在下面的代码中,我的测试用例按预期通过了,但我使用 stryker 进行突变测试,handleError 函数在突变测试中幸存下来,所以我想通过测试是否调用了 handleError 函数来杀死突变体。需要帮助测试私有功能。
我试过 spyOn 但没有用
const orderBuilderSpy = jest.spyOn(orderBuilder, 'build')
const handleError = jest.fn()
expect(rderBuilderSpy).toHaveBeenCalledWith(handleError)
// code written in nestJS/typescript
export class OrderBuilder {
private amount: number
public withAmount(amount: number): BuyOrderBuilder {
this.amount = amount
return this
}
public build(): TransactionRequest {
this.handleError()
return {
amount: this.amount,
acceptedWarningRules: [
{
ruleNumber: 4464
}
]
}
}
private handleError() {
const errors: string[] = []
const dynamicFields: string[] = [
'amount',
]
dynamicFields.forEach((field: string) => {
if (!this[field]) {
errors.push(field)
}
})
if (errors.length > 0) {
const errorMessage = errors.join()
throw new Error(`missing ${errorMessage} field in order`)
}
}
}
// test
describe('Order Builder', () => {
it('should test the handleError', () => {
const orderBuilder = new OrderBuilder()
const errorMessage = new Error(
`missing amount field in order`
)
try {
orderBuilder.build()
} catch (error) {
expect(error).toEqual(errorMessage)
}
});
});
解决方案
看起来您想要验证在运行handleError
时被调用。build
私有方法被编译为普通的 JavaScript 原型方法,因此您可以使用该any
类型让 spy 创建通过 TypeScript 类型检查。
这是一个高度简化的示例:
class OrderBuilder {
public build() {
this.handleError()
}
private handleError() {
throw new Error('missing ... field in order')
}
}
describe('Order Builder', () => {
it('should test the handleError', () => {
const handleErrorSpy = jest.spyOn(OrderBuilder.prototype as any, 'handleError');
const orderBuilder = new OrderBuilder()
expect(() => orderBuilder.build()).toThrow('missing ... field in order'); // Success!
expect(handleErrorSpy).toHaveBeenCalled(); // Success!
});
});
推荐阅读
- r - 如何不在 R 中按字母顺序进行 dplyr::summarize
- python - 为所有简单的 pip 安装包授予 sudo 权限
- symfony - 预先检查表单实体类型选项
- python - OSMnx - 示例文件的问题
- python - 如何过滤掉python中的等效值列表?
- javascript - 为什么我应该避免在 shouldComponentUpdate 中使用 _.isEqual
- javascript - Javascript,在 prev td 中获取输入值
- python - python - 如何删除每行(熊猫)中的重复列表?
- r - 如何删除在 2 列中以相反顺序包含相同对的行
- javascript - ComponentDidMount 反应原生状态