Browse Source
- 新增了多个测试用例,覆盖了提现功能的主要场景 - 添加了对最低提现金额、可用余额、支付宝信息完整性的验证 -测试了微信提现和支付宝提现的提交逻辑 - 新增了快捷金额按钮和全部金额按钮的测试 - 添加了调试组件,用于测试 Tabs 组件的点击和切换功能 - 优化了提现记录的渲染逻辑,增加了日志输出demo
3 changed files with 413 additions and 81 deletions
@ -0,0 +1,184 @@ |
|||||
|
import React from 'react' |
||||
|
import { render, fireEvent, waitFor } from '@testing-library/react' |
||||
|
import DealerWithdraw from '../index' |
||||
|
import { useDealerUser } from '@/hooks/useDealerUser' |
||||
|
import * as withdrawAPI from '@/api/shop/shopDealerWithdraw' |
||||
|
|
||||
|
// Mock dependencies
|
||||
|
jest.mock('@/hooks/useDealerUser') |
||||
|
jest.mock('@/api/shop/shopDealerWithdraw') |
||||
|
jest.mock('@tarojs/taro', () => ({ |
||||
|
showToast: jest.fn(), |
||||
|
getStorageSync: jest.fn(() => 123), |
||||
|
})) |
||||
|
|
||||
|
const mockUseDealerUser = useDealerUser as jest.MockedFunction<typeof useDealerUser> |
||||
|
const mockAddShopDealerWithdraw = withdrawAPI.addShopDealerWithdraw as jest.MockedFunction<typeof withdrawAPI.addShopDealerWithdraw> |
||||
|
const mockPageShopDealerWithdraw = withdrawAPI.pageShopDealerWithdraw as jest.MockedFunction<typeof withdrawAPI.pageShopDealerWithdraw> |
||||
|
|
||||
|
describe('DealerWithdraw', () => { |
||||
|
const mockDealerUser = { |
||||
|
userId: 123, |
||||
|
money: '10000.00', |
||||
|
realName: '测试用户', |
||||
|
mobile: '13800138000' |
||||
|
} |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
mockUseDealerUser.mockReturnValue({ |
||||
|
dealerUser: mockDealerUser, |
||||
|
loading: false, |
||||
|
error: null, |
||||
|
refresh: jest.fn() |
||||
|
}) |
||||
|
|
||||
|
mockPageShopDealerWithdraw.mockResolvedValue({ |
||||
|
list: [], |
||||
|
count: 0 |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
afterEach(() => { |
||||
|
jest.clearAllMocks() |
||||
|
}) |
||||
|
|
||||
|
test('应该正确显示可提现余额', () => { |
||||
|
const { getByText } = render(<DealerWithdraw />) |
||||
|
expect(getByText('10000.00')).toBeInTheDocument() |
||||
|
expect(getByText('可提现余额')).toBeInTheDocument() |
||||
|
}) |
||||
|
|
||||
|
test('应该验证最低提现金额', async () => { |
||||
|
mockAddShopDealerWithdraw.mockResolvedValue('success') |
||||
|
|
||||
|
const { getByPlaceholderText, getByText } = render(<DealerWithdraw />) |
||||
|
|
||||
|
// 输入低于最低金额的数值
|
||||
|
const amountInput = getByPlaceholderText('请输入提现金额') |
||||
|
fireEvent.change(amountInput, { target: { value: '50' } }) |
||||
|
|
||||
|
// 选择提现方式
|
||||
|
const wechatRadio = getByText('微信钱包') |
||||
|
fireEvent.click(wechatRadio) |
||||
|
|
||||
|
// 提交表单
|
||||
|
const submitButton = getByText('申请提现') |
||||
|
fireEvent.click(submitButton) |
||||
|
|
||||
|
await waitFor(() => { |
||||
|
expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({ |
||||
|
title: '最低提现金额为100元', |
||||
|
icon: 'error' |
||||
|
}) |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
test('应该验证提现金额不超过可用余额', async () => { |
||||
|
const { getByPlaceholderText, getByText } = render(<DealerWithdraw />) |
||||
|
|
||||
|
// 输入超过可用余额的金额
|
||||
|
const amountInput = getByPlaceholderText('请输入提现金额') |
||||
|
fireEvent.change(amountInput, { target: { value: '20000' } }) |
||||
|
|
||||
|
// 选择提现方式
|
||||
|
const wechatRadio = getByText('微信钱包') |
||||
|
fireEvent.click(wechatRadio) |
||||
|
|
||||
|
// 提交表单
|
||||
|
const submitButton = getByText('申请提现') |
||||
|
fireEvent.click(submitButton) |
||||
|
|
||||
|
await waitFor(() => { |
||||
|
expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({ |
||||
|
title: '提现金额超过可用余额', |
||||
|
icon: 'error' |
||||
|
}) |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
test('应该验证支付宝账户信息完整性', async () => { |
||||
|
const { getByPlaceholderText, getByText } = render(<DealerWithdraw />) |
||||
|
|
||||
|
// 输入有效金额
|
||||
|
const amountInput = getByPlaceholderText('请输入提现金额') |
||||
|
fireEvent.change(amountInput, { target: { value: '1000' } }) |
||||
|
|
||||
|
// 选择支付宝提现
|
||||
|
const alipayRadio = getByText('支付宝') |
||||
|
fireEvent.click(alipayRadio) |
||||
|
|
||||
|
// 只填写账号,不填写姓名
|
||||
|
const accountInput = getByPlaceholderText('请输入支付宝账号') |
||||
|
fireEvent.change(accountInput, { target: { value: 'test@alipay.com' } }) |
||||
|
|
||||
|
// 提交表单
|
||||
|
const submitButton = getByText('申请提现') |
||||
|
fireEvent.click(submitButton) |
||||
|
|
||||
|
await waitFor(() => { |
||||
|
expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({ |
||||
|
title: '请填写完整的支付宝信息', |
||||
|
icon: 'error' |
||||
|
}) |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
test('应该成功提交微信提现申请', async () => { |
||||
|
mockAddShopDealerWithdraw.mockResolvedValue('success') |
||||
|
|
||||
|
const { getByPlaceholderText, getByText } = render(<DealerWithdraw />) |
||||
|
|
||||
|
// 输入有效金额
|
||||
|
const amountInput = getByPlaceholderText('请输入提现金额') |
||||
|
fireEvent.change(amountInput, { target: { value: '1000' } }) |
||||
|
|
||||
|
// 选择微信提现
|
||||
|
const wechatRadio = getByText('微信钱包') |
||||
|
fireEvent.click(wechatRadio) |
||||
|
|
||||
|
// 提交表单
|
||||
|
const submitButton = getByText('申请提现') |
||||
|
fireEvent.click(submitButton) |
||||
|
|
||||
|
await waitFor(() => { |
||||
|
expect(mockAddShopDealerWithdraw).toHaveBeenCalledWith({ |
||||
|
userId: 123, |
||||
|
money: '1000', |
||||
|
payType: 10, |
||||
|
applyStatus: 10, |
||||
|
platform: 'MiniProgram' |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
await waitFor(() => { |
||||
|
expect(require('@tarojs/taro').showToast).toHaveBeenCalledWith({ |
||||
|
title: '提现申请已提交', |
||||
|
icon: 'success' |
||||
|
}) |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
test('快捷金额按钮应该正常工作', () => { |
||||
|
const { getByText, getByPlaceholderText } = render(<DealerWithdraw />) |
||||
|
|
||||
|
// 点击快捷金额按钮
|
||||
|
const quickAmountButton = getByText('500') |
||||
|
fireEvent.click(quickAmountButton) |
||||
|
|
||||
|
// 验证金额输入框的值
|
||||
|
const amountInput = getByPlaceholderText('请输入提现金额') as HTMLInputElement |
||||
|
expect(amountInput.value).toBe('500') |
||||
|
}) |
||||
|
|
||||
|
test('全部按钮应该设置为可用余额', () => { |
||||
|
const { getByText, getByPlaceholderText } = render(<DealerWithdraw />) |
||||
|
|
||||
|
// 点击全部按钮
|
||||
|
const allButton = getByText('全部') |
||||
|
fireEvent.click(allButton) |
||||
|
|
||||
|
// 验证金额输入框的值
|
||||
|
const amountInput = getByPlaceholderText('请输入提现金额') as HTMLInputElement |
||||
|
expect(amountInput.value).toBe('10000.00') |
||||
|
}) |
||||
|
}) |
@ -0,0 +1,80 @@ |
|||||
|
import React, { useState } from 'react' |
||||
|
import { View, Text } from '@tarojs/components' |
||||
|
import { Tabs, Button } from '@nutui/nutui-react-taro' |
||||
|
|
||||
|
/** |
||||
|
* 提现功能调试组件 |
||||
|
* 用于测试 Tabs 组件的点击和切换功能 |
||||
|
*/ |
||||
|
const WithdrawDebug: React.FC = () => { |
||||
|
const [activeTab, setActiveTab] = useState<string | number>('0') |
||||
|
const [clickCount, setClickCount] = useState(0) |
||||
|
|
||||
|
// Tab 切换处理函数
|
||||
|
const handleTabChange = (value: string | number) => { |
||||
|
console.log('Tab切换:', { from: activeTab, to: value, type: typeof value }) |
||||
|
setActiveTab(value) |
||||
|
setClickCount(prev => prev + 1) |
||||
|
} |
||||
|
|
||||
|
// 手动切换测试
|
||||
|
const manualSwitch = (tab: string | number) => { |
||||
|
console.log('手动切换到:', tab) |
||||
|
setActiveTab(tab) |
||||
|
setClickCount(prev => prev + 1) |
||||
|
} |
||||
|
|
||||
|
return ( |
||||
|
<View className="bg-gray-50 min-h-screen p-4"> |
||||
|
<View className="bg-white rounded-lg p-4 mb-4"> |
||||
|
<Text className="text-lg font-bold mb-2">调试信息</Text> |
||||
|
<Text className="block mb-1">当前Tab: {String(activeTab)}</Text> |
||||
|
<Text className="block mb-1">切换次数: {clickCount}</Text> |
||||
|
<Text className="block mb-1">Tab类型: {typeof activeTab}</Text> |
||||
|
</View> |
||||
|
|
||||
|
<View className="bg-white rounded-lg p-4 mb-4"> |
||||
|
<Text className="text-lg font-bold mb-2">手动切换测试</Text> |
||||
|
<View className="flex gap-2"> |
||||
|
<Button size="small" onClick={() => manualSwitch('0')}> |
||||
|
切换到申请提现 |
||||
|
</Button> |
||||
|
<Button size="small" onClick={() => manualSwitch('1')}> |
||||
|
切换到提现记录 |
||||
|
</Button> |
||||
|
</View> |
||||
|
</View> |
||||
|
|
||||
|
<View className="bg-white rounded-lg"> |
||||
|
<Tabs value={activeTab} onChange={handleTabChange}> |
||||
|
<Tabs.TabPane title="申请提现" value="0"> |
||||
|
<View className="p-4"> |
||||
|
<Text className="text-center text-gray-600">申请提现页面内容</Text> |
||||
|
<Text className="text-center text-sm text-gray-400 mt-2"> |
||||
|
当前Tab值: {String(activeTab)} |
||||
|
</Text> |
||||
|
</View> |
||||
|
</Tabs.TabPane> |
||||
|
|
||||
|
<Tabs.TabPane title="提现记录" value="1"> |
||||
|
<View className="p-4"> |
||||
|
<Text className="text-center text-gray-600">提现记录页面内容</Text> |
||||
|
<Text className="text-center text-sm text-gray-400 mt-2"> |
||||
|
当前Tab值: {String(activeTab)} |
||||
|
</Text> |
||||
|
</View> |
||||
|
</Tabs.TabPane> |
||||
|
</Tabs> |
||||
|
</View> |
||||
|
|
||||
|
<View className="bg-white rounded-lg p-4 mt-4"> |
||||
|
<Text className="text-lg font-bold mb-2">事件日志</Text> |
||||
|
<Text className="text-sm text-gray-500"> |
||||
|
请查看控制台输出以获取详细的切换日志 |
||||
|
</Text> |
||||
|
</View> |
||||
|
</View> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
export default WithdrawDebug |
Loading…
Reference in new issue