programing

형식 스크립트에서 개인 메서드를 농담으로 테스트

i4 2023. 6. 10. 08:19
반응형

형식 스크립트에서 개인 메서드를 농담으로 테스트

아래 코드에서 나의 테스트 케이스는 예상대로 통과되었지만 돌연변이 테스트를 위해 stryker를 사용하고 있으며, handleError 함수는 돌연변이 테스트에서 살아남아 handleError 함수가 호출되는지 여부를 테스트하여 돌연변이를 죽이고 싶습니다.개인 기능을 테스트하는 데 도움이 필요합니다.

스파이온을 시도했지만 작동하지 않았습니다.

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 프로토타입 메서드로 컴파일되므로anytype - 스파이 생성이 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!
  });
});

여기 있어요.

const handleErrorSpy = jest.spyOn(OrderBuilder.prototype  as unknown as keyof typeof OrderBuilder, 'handleError');

언급URL : https://stackoverflow.com/questions/56044471/testing-private-methods-in-typescript-with-jest

반응형