用jest测试typescript中的私有函数

用jest测试typescript中的私有函数,typescript,jestjs,nestjs,Typescript,Jestjs,Nestjs,在下面的代码中,我的测试用例按预期通过,但我正在使用stryker进行突变测试,handleError函数在突变测试中幸存,因此我想通过测试handleError函数是否被调用来杀死突变。需要帮助测试私有函数 我试过spyOn但没用 const orderBuilderSpy = jest.spyOn(orderBuilder, 'build') const handleError = jest.fn() expect(rderBuilderSpy).toHaveBeenCalledWith(h

在下面的代码中,我的测试用例按预期通过,但我正在使用stryker进行突变测试,handleError函数在突变测试中幸存,因此我想通过测试handleError函数是否被调用来杀死突变。需要帮助测试私有函数

我试过spyOn但没用

const orderBuilderSpy = jest.spyOn(orderBuilder, 'build')
const handleError = jest.fn()
expect(rderBuilderSpy).toHaveBeenCalledWith(handleError)
//用nestJS/typescript编写的代码
导出类OrderBuilder{
私人金额:数字
public withAmount(金额:编号):BuyOrderBuilder{
这个。金额=金额
还这个
}
公共生成():TransactionRequest{
这个.handleError()
返回{
金额:这个金额,
接受警告规则:[
{
规则编号:4464
}
]
}
}
私有句柄错误(){
常量错误:字符串[]=[]
常量动态字段:字符串[]=[
“金额”,
]
dynamicFields.forEach((字段:字符串)=>{
如果(!此[字段]){
错误。推送(字段)
}
})
如果(errors.length>0){
const errorMessage=errors.join()
抛出新错误(`顺序中缺少${errorMessage}字段`)
}
}
}
//试验
描述('订单生成器',()=>{
它('应该测试句柄错误',()=>{
const orderBuilder=new orderBuilder()
const errorMessage=新错误(
`订单中缺少金额字段`
)
试一试{
orderBuilder.build()
}捕获(错误){
expect(错误)。toEqual(错误消息)
}
});

});您似乎想验证在运行
build
时是否调用了
handleError

私有方法被编译为普通的JavaScript原型方法,因此您可以使用
any
类型让间谍创建通过类型脚本类型检查

下面是一个高度简化的示例:

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!
  });
});

这是一个在javascript类中模拟私有方法的好例子。我一直在尝试不同的方法jest.fn(),jest.spyOn(),但不能让它更早地工作。但现在我知道了。