У меня есть следующий класс, в котором фрагмент определен как массив, и несколько объектов помещаются в этот массив 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(), но это не сработало. Что мне не хватает?
Был бы очень признателен, если бы кто-нибудь мог помочь. Спасибо.
@deko_39 что ты имеешь в виду?
используйте SearchController['CHUNK_SIZE'] = xxx в коде тестирования, когда вам нужно имитировать это свойство
@deko_39 Я не могу, потому что CHUNK_SIZE только для чтения Cannot assign to 'CHUNK_SIZE' because it is a read-only property.
Вы можете использовать следующий трюк внутри блока 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()
, чтобы получить истинное значение модуля.
SearchController['CHUNK_SIZE'] это?