Как издеваться над свойством только для чтения в nodejs, используя jest

У меня есть следующий класс, в котором фрагмент определен как массив, и несколько объектов помещаются в этот массив this.chunk.

SearchController.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(), но это не сработало. Что мне не хватает?

Был бы очень признателен, если бы кто-нибудь мог помочь. Спасибо.

SearchController['CHUNK_SIZE'] это?

deko_39 18.01.2023 09:52

@deko_39 что ты имеешь в виду?

CEJ 18.01.2023 09:55

используйте SearchController['CHUNK_SIZE'] = xxx в коде тестирования, когда вам нужно имитировать это свойство

deko_39 18.01.2023 09:58

@deko_39 Я не могу, потому что CHUNK_SIZE только для чтения Cannot assign to 'CHUNK_SIZE' because it is a read-only property.

CEJ 18.01.2023 09:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать следующий трюк внутри блока 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();
});

Моя техника для таких случаев заключается в создании производного класса для конкретного теста:

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

… а затем имитируйте модуль SearchController.ts с новым классом. При необходимости я использую jest.requireActual(), чтобы получить истинное значение модуля.

Другие вопросы по теме