簡體   English   中英

如何用 Jest 模擬/替換 object 的 getter function?

[英]How to mock/replace getter function of object with Jest?

在 Sinon 我可以做以下事情:

var myObj = {
    prop: 'foo'
};

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

myObj.prop; // 'bar'

但是我怎樣才能對 Jest 做同樣的事情呢? 我不能只用jest.fn()之類的東西覆蓋 function ,因為它不會取代 getter

“無法設置 get 的值”

對於任何絆倒這個答案的人來說,Jest 22.1.0引入了窺探getter和setter方法的能力。

編輯:就像下面的scieslak的答案 ,因為你可以窺探getter和setter方法,你可以使用Jest模擬它們,就像使用任何其他函數一樣:

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

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

expect(something).toEqual('bar')

您可以使用Object.defineProperty

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

天啊我來過這么多次。 最后找出適當的解決方案。 如果你只關心間諜活動。 去找@Franey的回答。 但是,如果您確實需要為getter存儲一個值,那么就是這樣做的

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

在我的統一測試用例中,因為它預期模擬外部依賴項,按照 thomaux 的回答,我不得不在 beforeEach function 中使用真實實例而不是模擬實例,請參見下面的代碼片段。

//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')
  ...
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM