javascript 如何用Jest模拟/替换对象的getter函数?

58wvjzkj  于 2023-02-15  发布在  Java
关注(0)|答案(4)|浏览(173)

在Sinon,我可以做以下事情:

var myObj = {
    prop: 'foo'
};

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

myObj.prop; // 'bar'

但是如何对Jest执行同样的操作呢?我不能用类似jest.fn()的代码覆盖函数,因为它不会替换getter
“无法设置get的值”

dy1byipe

dy1byipe1#

对于任何其他偶然发现这个答案的人来说,Jest 22.1.0引入了监视getter和setter方法的能力。
编辑:就像下面的scieslak's answer一样,因为你可以监视getter和setter方法,所以你可以对它们使用Jest模拟,就像对其他函数一样:

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

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

expect(something).toEqual('bar')
k10s72fa

k10s72fa2#

您可以使用Object.defineProperty

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

7uhlpewt3#

如果你只关心间谍活动,那就去找@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)
  })
})
dgsult0t

dgsult0t4#

在我的unity测试用例中,因为它被期望模仿外部依赖关系,按照thomaux的回答,我不得不在beforeEach函数中使用一真实的示例而不是一个模仿的示例,参见下面的代码片段。

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

相关问题