У меня есть небольшой класс, который выполняет базовую операцию большого запроса:

const { BigQuery } = require('@google-cloud/bigquery');


export default class BQ {
    bigquery;

    constructor(projectId, keyFilename) {
        const options = {
            projectId,
            keyFilename,
            autoRetry: true,
        };
        
        this.bigquery = new BigQuery(options);
    }

    async query(query) {
        const options = {
            query,
            location: 'us',
        };
        const [job] = await this.bigquery.createQueryJob(options);
        const [rows] = await job.getQueryResults();
        return rows;
    }
}

Я пытаюсь написать модульный тест мокко для метода query. Тем не менее, я продолжаю создавать макеты в js. Есть много вариантов с Sinon, песочницами, заглушками и т. Д. Я бы подумал, что мне нужно заглушить атрибут экземпляра, например,

const bq = new BQ(projectId, keyFilename);
const bqStub = sandbox.stub(bq, 'bigquery');

Но есть методы, которые продолжают пытаться авторизоваться в Google, и мне тоже нужно заглушить их. Любая помощь о том, как начать работу, была бы замечательной.

0
TorusTorus 21 Июн 2020 в 02:29

1 ответ

Лучший ответ

Вы можете использовать Link Seams с CommonJS, нам понадобится proxyquire, чтобы построить наши швы.

Например.

bq.js:

const { BigQuery } = require('@google-cloud/bigquery');

export default class BQ {
  bigquery;

  constructor(projectId, keyFilename) {
    const options = {
      projectId,
      keyFilename,
      autoRetry: true,
    };

    this.bigquery = new BigQuery(options);
  }

  async query(query) {
    const options = {
      query,
      location: 'us',
    };
    const [job] = await this.bigquery.createQueryJob(options);
    const [rows] = await job.getQueryResults();
    return rows;
  }
}

bq.test.js:

import proxyquire from 'proxyquire';
import sinon from 'sinon';

describe('62492844', () => {
  it('should pass', async () => {
    const rows = [{ id: 1 }, { id: 2 }];
    const job = {
      getQueryResults: sinon.stub().returns([rows]),
    };
    const bigquery = {
      createQueryJob: sinon.stub().returns([job]),
    };
    const BigQueryStub = sinon.stub().returns(bigquery);
    const BQ = proxyquire('./bq', {
      '@google-cloud/bigquery': { BigQuery: BigQueryStub },
    }).default;

    const bq = new BQ('projectId', './svc.json');
    sinon.assert.calledWithExactly(BigQueryStub, {
      projectId: 'projectId',
      keyFilename: './svc.json',
      autoRetry: true,
    });
    const actual = await bq.query('query');
    sinon.assert.calledWithExactly(bigquery.createQueryJob, { query: 'query', location: 'us' });
    sinon.assert.calledOnce(job.getQueryResults);
    sinon.assert.match(actual, rows);
  });
});

Результат модульного теста:

  62492844
    ✓ should pass (2427ms)


  1 passing (2s)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 bq.ts    |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
1
slideshowp2 22 Июн 2020 в 03:26