node.js - Javascript nodeJs Postgres pg ერთეულების ტესტი


მე ვიყენებ PG ბიბლიოთეკას Postgres DB-სთან დასაკავშირებლად,

ახლა მინდა დავწერო ერთეულების ტესტები მონაცემთა ბაზასთან წვდომისთვის და არ ვიცი, როგორ შემიძლია ეს გავაკეთო. ფაქტობრივად, მჭირდება რომელიმე მექანიკური Postgres სერვერი ან რამე ისეთი, რომ შევძლო Postgres-ის მექანიკურ ვერსიას გამოყენება.

მე ვიყენებ Mocha ტესტირებისთვის

ქვემოთ არის ერთი ჩემი კლასი მონაცემთა ბაზაზე წვდომისთვის

import { Pool } from "pg";
export class DbAccess implements IdbAccess {
  private static readonly postgres = new Pool();

  constructor(@inject(TYPES.ILogger) private readonly logger: ILogger) {}

  public saveConsumer(consumer: IAPIGWConsumer): Promise<IAPIGWConsumer> {
    return this.queryOne`
        INSERT INTO users (consumer_id, email)
        VALUES (${consumer.consumer_id}, ${consumer.email})
        ON CONFLICT (consumer_id) DO UPDATE SET email = ${consumer.email}
        RETURNING *
    `;
  }
}

მოვიხდი მადლობას ნებისმიერი დახმარებისთვის, გმადლობთ.

პასუხი #1

თუ გსურთ გააპაროტ ან მოახდინოთ სტუბირება რაიმე პაკეტზე/მეთოდზე/მოდულზე, საჭიროა დააინსტალიროთ მაოქ/სტუბ ლაიბრარიები როგორიცაა sinon.js, jest.js ამის მისაღწევად.

აქ არის ერთეულის ტესტის გადაწყვეტილება sinon.js-ის გამოყენებით. სიმარტივისა და სისუფთავისთვის, მე გამოვკვეთე არასაჭირო ნაწილები, როგორიცაა DI.

db.ts:

import { Pool } from "pg";

export class DbAccess {
  private static readonly postgres = new Pool();

  public saveConsumer(consumer) {
    return DbAccess.postgres.query(`
        INSERT INTO users (consumer_id, email)
        VALUES (${consumer.consumer_id}, ${consumer.email})
        ON CONFLICT (consumer_id) DO UPDATE SET email = ${consumer.email}
        RETURNING *
    `);
  }
}

db.test.ts:

import pg from "pg";
import sinon from "sinon";
import { expect } from "chai";

describe("59624370", () => {
  afterEach(() => {
    sinon.restore();
  });
  it("should pass", async () => {
    const mPool = { query: sinon.stub().resolves({ rows: [] }) };
    const poolStub = sinon.stub(pg, "Pool").callsFake(() => mPool);
    const { DbAccess } = require("./db");
    const db = new DbAccess();
    const consumer = { consumer_id: 1, email: "[email " };
    const actual = await db.saveConsumer(consumer);
    expect(actual).to.be.eql({ rows: [] });
    sinon.assert.calledOnce(poolStub);
    sinon.assert.calledOnce(mPool.query);
  });
});

უნიტ ტესტის შედეგები დაფარვის ანგარიშით:

 59624370
    ✓ should pass (132ms)


  1 passing (141ms)

------------|----------|----------|----------|----------|-------------------|
File        |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
------------|----------|----------|----------|----------|-------------------|
All files   |      100 |      100 |      100 |      100 |                   |
 db.test.ts |      100 |      100 |      100 |      100 |                   |
 db.ts      |      100 |      100 |      100 |      100 |                   |
------------|----------|----------|----------|----------|-------------------|

წყარო კოდი: https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/59624370