在节点中使用 jest 模拟条纹 api

Mock stripe apis using jest in node

我想模拟 stripe api,但不知道该怎么做。我正在使用以下代码创建会话-

const stripe = require('stripe')('key');
const session = await stripe.checkout.sessions.create({
        payment_method_types: ['card'],
        line_items: [
          {
            price_data: {
              currency: 'usd',
              product_data: {
                name: 'abs',
                images: ['url'],
              },
              unit_amount: 100,
            },
            quantity: 1,
          },
        ],
        mode: 'payment',
        success_url: `${YOUR_DOMAIN}?success=true&session_id={CHECKOUT_SESSION_ID}`,
        cancel_url: `${YOUR_DOMAIN}?back=true&order_id=${req.clientReferenceId}`,
        metadata: req.metadata,
        client_reference_id: req.clientReferenceId,
        customer_email: req.customerEmail,
        billing_address_collection: 'required',
      });

我无法在测试文件中导入条带,因为它需要 API 密钥。这该怎么做? PS- 我尝试按照此操作 - Jest to mock Stripe 但它对我不起作用。

您需要在使用前创建 stripe 模拟:

jest.mock("stripe", ()=> ({
  checkout: {
    sessions: {
      create: jest.fn(()=> Promise.resolve()) //--> resolve data you are expecting
    }
  }
}));

您也可以使用 Manual Mocks

__mocks__/stripe.js

const stripe = {
      checkout: {
        sessions: {
          create: jest.fn(()=> Promise.resolve()) //--> resolve data you are expecting
        }
      }
    };

export default stripe;

stripe 作为函数导出,当你想模拟它时,你可以使用 jest.doMock 助手。

假设您有这样一个 index.js:

const stripe = require('stripe')('key'); // You use require('stripe') as a function

exports.CreateSession = async (req) => {
  const session = await stripe.checkout.sessions.create({
    // information to create session
  });
  return session;
}

那么,测试文件将是这样的:

describe('Create session', () => {
  beforeEach(() => {
    jest.resetModules(); // importance line
  });

  it('creates the session', async () => {
    const req = {
      unitAmount: 100,
      imageUrl: '',
      metadata: {
        userId: '1'
      }
    };

    jest.doMock('stripe', () => {
      // instead of mocking return an object, let’s return a function
      return jest.fn(() => ({ // when the function be called, it return an object like this
        checkout: {
          sessions: {
            create: jest.fn(() => Promise.resolve({
              sessionId: '123' // sessionId instead of id , right?
            })),
          },
        },
      }));
    });

    const { CreateSession } = require('./index'); // import function what you need to test
    const resp = await CreateSession(req); // execute with a parameter
    expect(resp.sessionId).toBe('123');
  });
});