относительно модульного тестирования в node js с помощью sinon - PullRequest
0 голосов
/ 17 января 2020
class FetchTenant {

    constructor (){
        this.Config = this._getConfig();
        this.Token = this._getToken();
        this.TenantMap = new Map();
    }

    async getTenantId(Id){

        if(!this.TenantMap[Id]){
            const serviceid = await this._getInfo(Id, false);
            this.TenantMap[Id] = serviceid;
        }

        return this.TenantMap[Id];
    }

    _getConfig() {
        return get_env_from_local({ name: 'env_1' });
    }

    async _getToken() {

        const options = {
          method: 'POST',
          uri: `${this.Config.url}`,
          json: true,
          resolveWithFullResponse: false,
          transform2xxOnly: true,
          transform: body => body.access_token,
          auth: {
            username: this.Config.clientid,
            password: this.Config.clientsecret
          },
          form: {
            grant_type: 'client_credentials'
          },
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
          }
        };

        return request(options)
          .catch(err => {
            logger.error('Could not get Token', err.statusCode, err.message);
            return null;
        });
    }

    async _getInfo(Id, newtoken) {
        if(newtoken){
            this.accessToken = await this._getToken();
            if(this.accessToken == null){
              logger.error(`fetching token failed`);
              return null;
            }
        }

        const options = {
          method: 'GET',
          uri: `${this.Config.url}/xyz/${Id}`,
          json: true,
          resolveWithFullResponse: false,
          transform2xxOnly: true,
          transform: body => body.tenantId,
          auth: {
            bearer: this.accessToken
          },
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
          }
        };

        return request(options)
          .catch(err => {
              if(err.statusCode != 401) {
                logger.error(`Could not get tenant id`, err.statusCode, err.message);
                return null;
              }
              else {
                return this._getServiceInstanceInfo(Id, true);
              }
          });
    }

}

module.exports = FetchTenant;

это класс, который я создал.

как написать модульный тест для этого класса, используя sinon (заглушка и макет), мне нужно протестировать только функции publi c и единственная функция publi c здесь getTenantId(Id), где во всех других закрытых функциях есть http-запрос, который может дать либо правильный ответ, либо ошибку.

есть ли способ протестировать publi c функция, высмеивая все другие частные функции. я хочу предварительно определить данные, которые будут возвращаться каждой частной функцией, и первичные данные, которые они извлекают из env и используют для отправки запроса.

1 Ответ

0 голосов
/ 17 января 2020

Вы можете использовать nock (https://www.npmjs.com/package/nock), чтобы высмеивать все ваши http-вызовы и тестировать функцию publi c, которую вы обычно выполняете.

...