programing

오브젝트의 getter 함수를 Jest로 모킹/바꾸는 방법

megabox 2023. 3. 10. 21:25
반응형

오브젝트의 getter 함수를 Jest로 모킹/바꾸는 방법

Sinon에서는 다음을 수행할 수 있습니다.

var myObj = {
    prop: 'foo'
};

sinon.stub(myObj, 'prop').get(function getterFn() {
    return 'bar';
});

myObj.prop; // 'bar'

하지만 내가 어떻게 제스트에게 똑같이 할 수 있을까?함수를 덮어쓸 수 없습니다.jest.fn()getter를 대체할 수 없기 때문에

"get 값을 설정할 수 없음"

Jest 22.1.0은 이 답변을 우연히 접한 다른 사용자를 위해 gettersetter 메서드를 감시하는 기능을 도입했습니다.

편집: 아래 scieslak의 답변과 같이 getter 및 setter 메서드를 감시할 수 있기 때문에 다른 기능과 마찬가지로 Jest mock을 함께 사용할 수 있습니다.

class MyClass {
  get something() {
    return 'foo'
  }
}

jest.spyOn(MyClass, 'something', 'get').mockReturnValue('bar')
const something = new MyClass().something

expect(something).toEqual('bar')

사용할 수 있습니다.

Object.defineProperty(myObj, 'prop', {
  get: jest.fn(() => 'bar'),
  set: jest.fn()
});

스파이 활동에만 관심이 있다면 @Franey의 답변을 받아보세요.단, 실제로 getter 값을 stub할 필요가 있는 경우에는 다음과 같이 합니다.

class Awesomeness {
  get isAwesome() {
    return true
  }
}

describe('Awesomeness', () => {
  it('is not always awesome', () => {
    const awesomeness = new Awesomeness
    jest.spyOn(awesomeness, 'isAwesome', 'get').mockReturnValue(false)

    expect(awesomeness.isAwesome).toEqual(false)
  })
})

나의 유니티 테스트 케이스에서는 외부 의존관계를 조롱할 것으로 예상되기 때문에 Tomaux의 답변에 따라 나는 이전의 조롱된 인스턴스가 아닌 실제 인스턴스를 사용해야 했다.각 함수는 아래 부분을 참조하십시오.

//declaration of MyExternalConfigService with getter
@Injectable()
export class MyExternalConfigService {
  constructor(private readonly configService: ConfigService) {}
  get myProp():string {
    return this.configService.get<string>('context.myProp')
  }
}

//beforeEach unit test configuration
beforeEach(async () => {
  const module: TestingModule = await Test.createTestingModule({
    providers: [
      MyServiceToBeTested,
      {
       provide: MyExternalConfigService,
        useValue: new MyExternalConfigService(new ConfigService())
      }        
    ]
  }).compile()

  service = module.get<MyServiceToBeTested>(
    MyServiceToBeTested
  )
  configService = module.get<MyExternalConfigService>MyExternalConfigService)

})

//mocking a value to your test case
it('my test case', ()=>{
  jest
    .spyOn(configService, 'myProp', 'get')
    .mockImplementationOnce(() => 'mockedValue')
  ...
)

언급URL : https://stackoverflow.com/questions/43697455/how-to-mock-replace-getter-function-of-object-with-jest

반응형