Создать объект с заглушкой Sinon в качестве входных данных для конструктора - PullRequest
0 голосов
/ 04 августа 2020

Я пишу модульные тесты с использованием 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.

Вся документация по заглушкам и вложенным заглушкам мне не помогла.

1 Ответ

0 голосов
/ 05 августа 2020

Так у меня получилось рабочее решение. Вероятно, это не лучшая практика, но это лучшее, что я мог сделать:

Для объекта Context я просто создаю пустой объект вроде этого:

contextMock = <Context><unknown>{
                  clients: {
                      elasticSearch: new Client()
                  }
               }

затем я создаю с этим объектом контроллера:

controller = new Controller(contextMock);

, тогда я могу имитировать функции свойства elasticSearch следующим образом:

searchStub = sinon.stub(contextMock.clients.elasticSearch, 'search');

И тогда у меня есть все необходимое для тестирования класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...