如何使用jest模拟nodejs中的只读属性

92vpleto  于 2023-01-18  发布在  Jest
关注(0)|答案(2)|浏览(179)

我有下面的类,它有一个块定义为一个数组,多个对象被推入这个数组this.chunk

搜索控制器.ts

@Injectable()
export class SearchController {
  private chunk: any[] = [];
  readonly CHUNK_SIZE: number = 100;

  public async post(names) {

    this.chunk.push(names);

    if (this.chunk.length >= this.CHUNK_SIZE) {
        return true;
    }
    return false;

  }
}

我希望能够将CHUNK_SIZE模拟为等于1的数字,或者能够更改chunk.length的值
下面是我的测试
SearchController.test.ts

it('should return true for chunk_size 1', async () => {

    const actual = await queue.post({action: 'UPDATE'});

    expect(actual).toBeTruthy();
  });

我试过使用jest.spyOn(),但它不起作用。我错过了什么?
如果有人能帮忙我会很感激的。谢谢。

3phpmpom

3phpmpom1#

您可以在it块中使用以下技巧:

Object.defineProperty(<instanceOfController>, 'CHUNK_SIZE', { value: <anyRandomValue>, writable: false });

例如:

it('should return true for chunk_size 1', async () => {
  Object.defineProperty(queue, 'CHUNK_SIZE', { value: 1, writable: false });

  const actual = await queue.post({ action: 'UPDATE' });
  expect(actual).toBeTruthy();
});
f5emj3cl

f5emj3cl2#

我处理这种情况的技巧是创建一个派生的特定于测试的类:

class SearchControllerTest extends SearchController {
  override readonly CHUNK_SIZE = 1; // property cannot be private in parent class
}

...然后用新的类模拟 SearchController.ts 模块。如果需要,我使用jest.requireActual()来获取模块的真实值。

相关问题