【问题标题】:Mock stripe apis using jest in node在节点中使用 jest 模拟条带 api
【发布时间】:2021-03-04 14:49:27
【问题描述】:

我想模拟条带 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 但它对我不起作用。

【问题讨论】:

    标签: javascript node.js jestjs stripe-payments


    【解决方案1】:

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

    想象一下你有一个这样的 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');
      });
    });
    

    【讨论】:

    • 谢谢!有效。只是一个变化,而不是 sessionId 它将是 Id
    【解决方案2】:

    您需要在使用之前创建stripe mock:

    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;
    

    【讨论】:

    • 感谢您的回答。但它仍然没有被嘲笑 - describe('Create session', () => { it('creates the session', async () => { const req = {unitAmount: 100, imageUrl: '', metadata: new Metadata({userId: '1'})}; jest.mock('stripe', () => ({ checkout: { sessions: { create: jest.fn(() => Promise.resolve({id: ' 123'})), }, }, })); const resp = await mock.createSession(new CreateSessionRequest(req)); expect(resp.sessionId).toBe('123'); }); });
    • mock.createSession和CreateSessionRequest是如何实现的?
    • 对不起,我没明白你的意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2019-04-10
    • 1970-01-01
    • 2021-09-11
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多