|
|
@@ -217,7 +217,7 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('蓝色款')).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- it('选择规格后更新显示', async () => {
|
|
|
+ it('选择规格后执行操作', async () => {
|
|
|
const mockGoodsResponse = {
|
|
|
status: 200,
|
|
|
json: async () => mockGoods
|
|
|
@@ -238,9 +238,9 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('测试商品', { selector: '.goods-title' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 打开规格选择弹窗
|
|
|
- const specButton = screen.getByText('选择规格', { selector: '.spec-select-btn' })
|
|
|
- fireEvent.click(specButton)
|
|
|
+ // 打开规格选择弹窗 - 新流程:点击加入购物车按钮
|
|
|
+ const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ fireEvent.click(addToCartButton)
|
|
|
|
|
|
// 等待规格弹窗加载
|
|
|
await waitFor(() => {
|
|
|
@@ -251,18 +251,22 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
const redSpec = screen.getByText('红色款')
|
|
|
fireEvent.click(redSpec)
|
|
|
|
|
|
- // 点击确认按钮
|
|
|
- const confirmButton = screen.getByText(/确定/)
|
|
|
+ // 点击确认按钮 - 根据新流程,确认后直接执行加入购物车操作
|
|
|
+ const confirmButton = screen.getByText(/加入购物车/, { selector: '.spec-confirm-btn' })
|
|
|
fireEvent.click(confirmButton)
|
|
|
|
|
|
- // 等待规格弹窗关闭,页面更新
|
|
|
- await waitFor(() => {
|
|
|
- // 验证规格信息显示在页面上(不是在弹窗中)
|
|
|
- expect(screen.getByText('红色款')).toBeInTheDocument()
|
|
|
+ // 验证addToCart被调用,使用规格信息
|
|
|
+ // 注意:根据新流程,选择规格后直接执行操作,所以不需要等待页面显示规格信息
|
|
|
+ expect(mockAddToCart).toHaveBeenCalledWith({
|
|
|
+ id: 101, // 子商品ID
|
|
|
+ parentGoodsId: 1, // 父商品ID(goods.id)
|
|
|
+ name: '红色款',
|
|
|
+ price: 299,
|
|
|
+ image: 'http://example.com/main.jpg',
|
|
|
+ stock: 50,
|
|
|
+ quantity: 1
|
|
|
+ // spec字段已移除,因为不再需要
|
|
|
})
|
|
|
-
|
|
|
- expect(screen.getByText('¥299.00', { selector: '.spec-price' })).toBeInTheDocument()
|
|
|
- expect(screen.getByText('库存: 50', { selector: '.spec-stock' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
it('选择规格后加入购物车', async () => {
|
|
|
@@ -286,9 +290,9 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('测试商品', { selector: '.goods-title' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 打开规格选择弹窗并选择规格
|
|
|
- const specButton = screen.getByText('选择规格', { selector: '.spec-select-btn' })
|
|
|
- fireEvent.click(specButton)
|
|
|
+ // 打开规格选择弹窗并选择规格 - 新流程:点击加入购物车按钮
|
|
|
+ const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ fireEvent.click(addToCartButton)
|
|
|
|
|
|
// 等待规格弹窗加载
|
|
|
await waitFor(() => {
|
|
|
@@ -299,20 +303,12 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
const redSpec = screen.getByText('红色款')
|
|
|
fireEvent.click(redSpec)
|
|
|
|
|
|
- // 点击确认按钮
|
|
|
- const confirmButton = screen.getByText(/确定/)
|
|
|
+ // 点击确认按钮 - 根据新流程,确认后直接执行加入购物车操作
|
|
|
+ const confirmButton = screen.getByText(/加入购物车/, { selector: '.spec-confirm-btn' })
|
|
|
fireEvent.click(confirmButton)
|
|
|
|
|
|
- // 等待规格弹窗关闭,页面更新
|
|
|
- await waitFor(() => {
|
|
|
- expect(screen.getByText('红色款')).toBeInTheDocument()
|
|
|
- })
|
|
|
-
|
|
|
- // 点击加入购物车
|
|
|
- const addToCartButton = screen.getByText('加入购物车')
|
|
|
- fireEvent.click(addToCartButton)
|
|
|
-
|
|
|
// 验证addToCart被调用,使用规格信息
|
|
|
+ // 注意:根据新流程,选择规格后直接执行操作,所以不需要等待页面显示规格信息
|
|
|
expect(mockAddToCart).toHaveBeenCalledWith({
|
|
|
id: 101, // 子商品ID
|
|
|
parentGoodsId: 1, // 父商品ID(goods.id)
|
|
|
@@ -320,8 +316,8 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
price: 299,
|
|
|
image: 'http://example.com/main.jpg',
|
|
|
stock: 50,
|
|
|
- quantity: 1,
|
|
|
- spec: '红色款'
|
|
|
+ quantity: 1
|
|
|
+ // spec字段已移除,因为不再需要
|
|
|
})
|
|
|
})
|
|
|
|
|
|
@@ -346,9 +342,9 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('测试商品', { selector: '.goods-title' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 打开规格选择弹窗并选择规格
|
|
|
- const specButton = screen.getByText('选择规格', { selector: '.spec-select-btn' })
|
|
|
- fireEvent.click(specButton)
|
|
|
+ // 打开规格选择弹窗并选择规格 - 新流程:点击立即购买按钮
|
|
|
+ const buyNowButton = screen.getByText('立即购买')
|
|
|
+ fireEvent.click(buyNowButton)
|
|
|
|
|
|
// 等待规格弹窗加载
|
|
|
await waitFor(() => {
|
|
|
@@ -360,27 +356,20 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
fireEvent.click(redSpec)
|
|
|
|
|
|
// 点击确认按钮
|
|
|
- const confirmButton = screen.getByText(/确定/)
|
|
|
+ const confirmButton = screen.getByText(/立即购买/, { selector: '.spec-confirm-btn' })
|
|
|
fireEvent.click(confirmButton)
|
|
|
|
|
|
- // 等待规格弹窗关闭,页面更新
|
|
|
- await waitFor(() => {
|
|
|
- expect(screen.getByText('红色款')).toBeInTheDocument()
|
|
|
- })
|
|
|
|
|
|
- // 点击立即购买
|
|
|
- const buyNowButton = screen.getByText('立即购买')
|
|
|
- fireEvent.click(buyNowButton)
|
|
|
+ // 确认按钮点击后直接执行立即购买操作,不需要再次点击立即购买按钮
|
|
|
+ // 验证setStorageSync已被调用,存储购买信息
|
|
|
|
|
|
- // 验证setStorageSync被调用,存储购买信息
|
|
|
expect(mockSetStorageSync).toHaveBeenCalledWith('buyNow', {
|
|
|
goods: {
|
|
|
id: 101,
|
|
|
name: '红色款',
|
|
|
price: 299,
|
|
|
image: 'http://example.com/main.jpg',
|
|
|
- quantity: 1,
|
|
|
- spec: '红色款'
|
|
|
+ quantity: 1
|
|
|
},
|
|
|
totalAmount: 299
|
|
|
})
|
|
|
@@ -422,8 +411,7 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
price: 299,
|
|
|
image: 'http://example.com/main.jpg',
|
|
|
stock: 100,
|
|
|
- quantity: 1,
|
|
|
- spec: ''
|
|
|
+ quantity: 1
|
|
|
})
|
|
|
})
|
|
|
|
|
|
@@ -448,9 +436,9 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('测试商品', { selector: '.goods-title' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 打开规格选择弹窗并选择库存较少的规格
|
|
|
- const specButton = screen.getByText('选择规格')
|
|
|
- fireEvent.click(specButton)
|
|
|
+ // 打开规格选择弹窗并选择库存较少的规格 - 新流程:点击加入购物车按钮
|
|
|
+ const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ fireEvent.click(addToCartButton)
|
|
|
|
|
|
// 等待规格弹窗加载
|
|
|
await waitFor(() => {
|
|
|
@@ -462,15 +450,16 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
fireEvent.click(blueSpec)
|
|
|
|
|
|
// 点击确认按钮
|
|
|
- const confirmButton = screen.getByText(/确定/)
|
|
|
+ const confirmButton = screen.getByText(/加入购物车/, { selector: '.spec-confirm-btn' })
|
|
|
fireEvent.click(confirmButton)
|
|
|
|
|
|
- // 等待规格弹窗关闭,页面更新
|
|
|
+ // 规格选择器关闭后,页面不显示规格信息
|
|
|
+ // 等待规格选择器关闭
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('蓝色款')).toBeInTheDocument()
|
|
|
+ expect(screen.queryByText('蓝色款')).not.toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 获取数量输入框
|
|
|
+ // 获取数量输入框 - 商品详情页上的数量输入框
|
|
|
const quantityInput = screen.getByDisplayValue('1')
|
|
|
|
|
|
// 尝试输入超过库存的数量
|
|
|
@@ -541,7 +530,7 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(buyNowButton).not.toBeDisabled()
|
|
|
})
|
|
|
|
|
|
- it('有规格选项但库存为0时按钮应禁用', async () => {
|
|
|
+ it('有规格选项但库存为0时按钮不禁用', async () => {
|
|
|
// 创建库存为0的子商品数据
|
|
|
const zeroStockChildren = {
|
|
|
data: [
|
|
|
@@ -576,9 +565,9 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('测试商品', { selector: '.goods-title' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 打开规格选择弹窗
|
|
|
- const specButton = screen.getByText('选择规格', { selector: '.spec-select-btn' })
|
|
|
- fireEvent.click(specButton)
|
|
|
+ // 打开规格选择弹窗 - 新流程:点击加入购物车按钮
|
|
|
+ const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ fireEvent.click(addToCartButton)
|
|
|
|
|
|
// 等待规格弹窗加载
|
|
|
await waitFor(() => {
|
|
|
@@ -590,19 +579,18 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
fireEvent.click(blackSpec)
|
|
|
|
|
|
// 点击确认按钮
|
|
|
- const confirmButton = screen.getByText(/确定/)
|
|
|
+ const confirmButton = screen.getByText(/加入购物车/, { selector: '.spec-confirm-btn' })
|
|
|
fireEvent.click(confirmButton)
|
|
|
|
|
|
// 等待规格弹窗关闭,页面更新
|
|
|
- await waitFor(() => {
|
|
|
- expect(screen.getByText('黑色款')).toBeInTheDocument()
|
|
|
- })
|
|
|
+ // 注意:根据新流程,选择规格后直接执行操作,页面不显示规格信息
|
|
|
+ // 所以不需要等待黑色款文本显示在页面上
|
|
|
|
|
|
- // 验证按钮禁用(因为选择的规格库存为0)
|
|
|
- const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ // 验证按钮不禁用(根据新逻辑,多规格商品按钮总是不禁用)
|
|
|
+ const addToCartButtonAfter = screen.getByText('加入购物车')
|
|
|
const buyNowButton = screen.getByText('立即购买')
|
|
|
- expect(addToCartButton).toBeDisabled()
|
|
|
- expect(buyNowButton).toBeDisabled()
|
|
|
+ expect(addToCartButtonAfter).not.toBeDisabled()
|
|
|
+ expect(buyNowButton).not.toBeDisabled()
|
|
|
})
|
|
|
|
|
|
it('无规格选项且商品库存为0时按钮应禁用', async () => {
|
|
|
@@ -711,9 +699,9 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
expect(screen.getByText('测试商品', { selector: '.goods-title' })).toBeInTheDocument()
|
|
|
})
|
|
|
|
|
|
- // 打开规格选择弹窗
|
|
|
- const specButton = screen.getByText('选择规格', { selector: '.spec-select-btn' })
|
|
|
- fireEvent.click(specButton)
|
|
|
+ // 打开规格选择弹窗 - 新流程:点击加入购物车按钮
|
|
|
+ const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ fireEvent.click(addToCartButton)
|
|
|
|
|
|
// 等待规格弹窗加载
|
|
|
await waitFor(() => {
|
|
|
@@ -739,10 +727,10 @@ describe('GoodsDetailPage集成测试', () => {
|
|
|
// 验证页面没有选择规格
|
|
|
expect(screen.queryByText('红色款', { selector: '.spec-price' })).not.toBeInTheDocument()
|
|
|
|
|
|
- // 验证按钮禁用(因为未选择规格但有规格选项)
|
|
|
- const addToCartButton = screen.getByText('加入购物车')
|
|
|
+ // 验证按钮不禁用(根据新逻辑,多规格商品按钮总是不禁用)
|
|
|
+ const addToCartButtonAfterClose = screen.getByText('加入购物车')
|
|
|
const buyNowButton = screen.getByText('立即购买')
|
|
|
- expect(addToCartButton).toBeDisabled()
|
|
|
- expect(buyNowButton).toBeDisabled()
|
|
|
+ expect(addToCartButtonAfterClose).not.toBeDisabled()
|
|
|
+ expect(buyNowButton).not.toBeDisabled()
|
|
|
})
|
|
|
})
|