尝试测试我的 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' });
}
});
我尝试创建一个客户端和服务文件,然后对其运行测试,但由于某种原因它对我不起作用。
尝试修改部分语法,但也找不到修复方法。
使用 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
希望这有帮助