У меня есть небольшой класс, который выполняет базовую операцию большого запроса:
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, и мне тоже нужно заглушить их. Любая помощь о том, как начать работу, была бы замечательной.
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 |
----------|---------|----------|---------|---------|-------------------
Похожие вопросы
Связанные вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.