test etme - Jest ve TypeScript ile eksik stublar


Jest kullanarak test için bir fonksiyonu geçici olarak devre dışı bırakmaya çalışıyorum. TypeScript kullandığım için derleyici, stubb’un tüm nesne alanlarını döndürdüğünden emin olmam konusunda beni rahatsız ediyor. Tüm nesne alanlarına ihtiyacım yok, sadece ikisine ihtiyacım var. Dahası, bu nesne oldukça karmaşık.

Sahip olduğum şey

import * as sinon from "sinon";
import * as stripeHelpers from "../../src/lib/stripe";

describe("lib/authorization", () => {
    let sandbox: sinon.SinonSandbox;
    beforeAll(() => {
        sandbox = sinon.createSandbox();
    });

    afterEach(() => {
        sandbox.restore();
    });

    describe("getAuthorizationDateRange", () => {
        test("returns an authorization date range", async () => {
            const getUserSubscriptionStub = sandbox.stub(stripeHelpers, "getUserSubscription").resolves({
                current_period_end: 123123,
                current_period_start: 123123,
                object: "subscription",
                application_fee_percent: undefined,
                billing: "charge_automatically",
                collection_method: "charge_automatically",
                billing_cycle_anchor: 0,
                billing_thresholds: undefined,
                cancel_at: undefined,
                cancel_at_period_end: true,
                canceled_at: undefined,
                created: 0,
                customer: "test",
                days_until_due: undefined,
                default_payment_method: "test",
                default_source: "test",
                default_tax_rates: [],
                discount: undefined,
                ended_at: undefined,
                items,
                latest_invoice: "test",
                livemode: true,
                metadata: {},
                start: 0,
                start_date: 0,
                status: "active",
                tax_percent: undefined,
                trial_end: undefined,
                trial_start: undefined,
            });
        });
    });
});

Yapmak istediğim şey

import * as sinon from "sinon";
import * as stripeHelpers from "../../src/lib/stripe";

describe("lib/authorization", () => {
    let sandbox: sinon.SinonSandbox;
    beforeAll(() => {
        sandbox = sinon.createSandbox();
    });

    afterEach(() => {
        sandbox.restore();
    });

    describe("getAuthorizationDateRange", () => {
        test("returns an authorization date range", async () => {
            const getUserSubscriptionStub = sandbox.stub(stripeHelpers, "getUserSubscription").resolves({
                current_period_end: 123123,
                current_period_start: 123123,
            });
        });
    });
});

Test edilen fonksiyon

export async function getAuthorizationDateRange(user: User): Promise<DateRange> {
    const subscription: Stripe.subscriptions.ISubscription = await stripeHelpers.getUserSubscription(user);
    return {
        start: moment.unix(subscription.current_period_start).toDate(),
        end: moment.unix(subscription.current_period_end).toDate()
    };
}

Fonksiyon sadece ilk iki özelliği kullanıyor, bu yüzden tüm nesneyi yeniden yaratmaya çalışmak çaba kaybı gibi hissettiriyor. Stripe.subscriptions.ISubscription arayüzü, testlerimde gerçekten kaçınmak istediğim birçok iç içe geçme ve karmaşıklık içeriyor.

Cevap #1

Anlaşılan, nesneyi açık bir şekilde any olarak dönüştürmeniz yeterli.

const getUserSubscriptionStub = sandbox.stub(stripeHelpers, "getUserSubscription").resolves({
    current_period_end: 123123,
    current_period_start: 123123,
} as any);