Я пишу модульные тесты с использованием mocha, chai и sinon на TypeScript. Мне нужно протестировать класс, конструктор которого ожидает объект в качестве входного параметра, который я хочу высмеять, потому что его слишком сложно создать. Также некоторые методы класса используют свойства указанного c объекта входных параметров. Так что мне также нужно было бы издеваться над методами этого измышленного объекта.
Может быть, какой-то код проясняет:
Мой класс выглядит так (упрощенно):
class Controller {
constructor(context: Context) {
this._context = context;
}
protected get elasticSearch(): Client {
return this._context.clients.elasticSearch;
}
// the next method should be tested
public async getSomething(input1: string, input2: string): Promise<ResultObject> {
const result = new ResultObject();
await this.elasticSearch.search(query).then((_res)=>{
// do something with _res
result.prop = _res;
});
return result;
}
}
Теперь я хочу протестировать функцию getSomething
. Для этого мне сначала нужно создать объект Controller. Но конструктору нужен объект Context, которого у меня нет. Для этого я уже пробовал оба из следующих вариантов:
const controllerStub = sinon.createStubInstance(Controller);
controllerStub.elasticSearch = sinon.stub();
--------------------------------------------------
const contextMock = <Context>{};
const controller = new Controller(contextMock);
controller.elasticSearch = sinon.stub();
controller.elasticSearch.search = sinon.stub();
, которые не работали, потому что свойство elasticSearch
не существует для типа SinonStubbedInstance<Controller>
, и я не могу установить свойство elasticSearch в первую очередь так как у него есть только геттер.
Так что теперь я действительно не знаю, что имитировать и как протестировать эту getSomething
функцию. В лучшем случае я хочу сказать, что elasticsearch.search(query)
возвращает определенное значение, и это конкретное значение c должно обрабатываться дальше в части .then. Я хочу пропустить доступ к elasticSearch, но все же хочу, чтобы запускалась часть .then.
Вся документация по заглушкам и вложенным заглушкам мне не помогла.