如何在 Jest 测试中使用 Twilio 模拟创建短信功能

问题描述 投票:0回答:1

尝试测试我的 Twilio API 调用,但由于某种原因无法模拟创建消息,

这是我的终端错误日志:

 TypeError: Cannot set properties of undefined (setting 'create')

      27 |   it('should send a verification code via SMS (mocked)', async () => {
      28 |     const mockCreate = jest.fn().mockResolvedValue({ sid: 'some-message-sid' });
    > 29 |     twilio.messages.create = mockCreate;
         |                           ^
      30 |
      31 |     const response = await request(app)
      32 |       .post('/send-verification-code')

      at _callee2$ (server/server.test.js:29:27)
      at call (server/server.test.js:2:1)
      at Generator.tryCatch (server/server.test.js:2:1)
      at Generator._invoke [as next] (server/server.test.js:2:1)
      at asyncGeneratorStep (server/server.test.js:2:1)
      at asyncGeneratorStep (server/server.test.js:2:1)
      at _next (server/server.test.js:2:1)
      at Object.<anonymous> (server/server.test.js:2:1)

服务器.test.js

require('@babel/register')({
  presets: ['@babel/preset-env']
}); 

import request from 'supertest';
import app from './server.mjs'; 
import twilio from 'twilio';

describe('Server endpoints', () => {
  it('should send a verification code via SMS (mocked)', async () => {
    const mockCreate = jest.fn().mockResolvedValue({ sid: 'some-message-sid' });
    twilio.messages.create = mockCreate;

    const response = await request(app)
      .post('/send-verification-code')
      .send({ formattedPhoneNumber: '+447720761143' });

    expect(response.status).toBe(200);
    expect(response.body).toHaveProperty('verificationCode');
    expect(mockCreate).toHaveBeenCalledWith({
      body: expect.stringContaining('verification code'),
      from: twilioPhoneNumber,
      to: '+447720761143',
    });
  });
});

--

服务器.mjs

import dotenv from 'dotenv';
import express from 'express';
import cors from 'cors';
import bodyParser from 'body-parser';  // Added for parsing request bodies
import twilio from 'twilio';  // Added for Twilio integration

dotenv.config();
const app = express();

app.use(express.json());
app.use(bodyParser.urlencoded({ extended: true }));  // Added for parsing URL-encoded bodies
app.set('trust proxy', true);
app.use(cors());

const port = 3001;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

// Twilio API Endpoint

// Twilio credentials

const twilioAccountSid = process.env.TWILIO_ACCOUNT_SID;
const twilioAuthToken = process.env.TWILIO_AUTH_TOKEN;
const twilioPhoneNumber = process.env.TWILIO_PHONE_NUMBER;

const client = twilio(twilioAccountSid, twilioAuthToken);

// Endpoint to send verification code via SMS

app.post('/send-verification-code', async (req, res) => {
  console.log('Endpoint reached: /send-verification-code');
  const { formattedPhoneNumber } = req.body;

  // Log the received data
  console.log('Received request with formattedPhoneNumber:', formattedPhoneNumber);

  try {
    // Generate a random verification code
    const verificationCode = Math.floor(100000 + Math.random() * 900000);

    // Send SMS using Twilio
    await client.messages.create({
      body: `G-${verificationCode} is your Google verification code.`,
      from: twilioPhoneNumber,
      to: formattedPhoneNumber,
    })
    .then(message => {
      console.log('Twilio API call successful:', message.sid);
      console.log('Verification code:', verificationCode)
      res.json({ 
        sid: message.sid,
        verificationCode: verificationCode,
      });
    })
    .catch(error => {
      console.error('Twilio API call error:', error.response ? error.response.data : error);
      res.status(500).json({ error: 'Internal Server Error' });
    });

  } catch (error) {
    console.error('Error in try-catch block:', error.response ? error.response.data : error);
    res.status(500).json({ error: 'Internal Server Error' });
  }
});

我尝试创建一个客户端和服务文件,然后对其运行测试,但由于某种原因它对我不起作用。

尝试修改部分语法,但也找不到修复方法。

javascript jestjs mocking twilio
1个回答
0
投票

使用 jest,您可以通过在描述块之前指定以下代码来模拟 Twilio SDK

const createMessageMock = jest.fn();
jest.mock('twilio', () => ({
  Twilio: jest.fn(() => ({
    messages: {
      create: createMessageMock
    }
  }))
}));

然后在每个测试中,您可以设置模拟实现来控制创建消息返回的内容,即

createMessageMock.mockImplementation(() => ({ sid: 'SMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' }));

完整示例请参见 https://github.com/RJPearson94/scheduled-message-sender/blob/main/test/lambda.spec.ts

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.