У меня есть класс с именем ReportHandler
, который зависит от других классов (ReportService
, S3Handlere
), таких как этот:
S3Handler
: класс для загрузки, загрузки файла в S3 ReportService
: Выполнение CRUD для базы данных
handleReportAsync
- это функция, которая загружает файл из S3, выполняет некоторые логические операции c и обновляет файл в базе данных.
export class ReportHandler {
private s3Handler;
private reportService;
public constructor(reportService) {
this.reportService = reportService;;
const accessKey = process.env.AWS_ACCESS_KEY;
const secretKey = process.env.AWS_SECRET_ACCESS_KEY;
const bucketName = process.env.AWS_BUCKET_NAME;
this.s3Handler = new S3Handler(accessKey, secretKey, bucketName);
}
public async handleReportAsync(report) {
try {
const data = await this.s3Handler.downloadFile(report.id);
// do some logic
reportService.updateFile(report.id, data.Body);
} catch (error) {
}
}
}
Я хочу проверить, вызван ли reportService.updateFile()
или нет, поэтому я буду использовать spy
для этой задачи.
И, очевидно, я не хочу скачать реальный файл с S3 так, как я могу заглушить функцию this.s3Handler.downloadFile()
с помощью Sinon.js
. Это моя попытка, но безуспешно.
describe("ReportHandler", () => {
describe("handleReportAsync", () => {
let sandbox;
beforeEach(() => {
sandbox = Sinon.createSandbox();
});
afterEach(() => {
sandbox.restore();
});
it("should call updateFile() function", async () => {
const report = new Report(faker.random.uuid());
sandbox.stub(S3Handler.prototype, "downloadFile").callsFake(
(id) => {},
);
sandbox.stub(ReportService.prototype, "updateFile").callsFake(
(id, file) => {},
);
const reportHandler = new ReportHandler(new ReportService());
const spy = Sinon.spy(ReportService.prototype, "updateFile");
await reportHandler.handleReportAsync(report);
expect(spy.called).to.be.true;
});
});
});
Любой совет приветствуется! Заранее спасибо.