109 lines
3.1 KiB
JavaScript
109 lines
3.1 KiB
JavaScript
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
||
import * as fc from 'fast-check'
|
||
|
||
/**
|
||
* Property 11: 分页加载参数正确性
|
||
*
|
||
* 对于任意初始页码和连续N次加载更多操作,
|
||
* 第i次请求的page参数应等于初始页码+i。
|
||
*
|
||
* 我们通过模拟分页加载逻辑来验证此属性。
|
||
*/
|
||
|
||
/**
|
||
* 分页加载器:模拟积分页的分页逻辑
|
||
* 与 pages/points/points.vue 中的逻辑一致
|
||
*/
|
||
function createPaginationLoader(fetchFn, pageSize = 20) {
|
||
let page = 1
|
||
let noMore = false
|
||
let loading = false
|
||
const records = []
|
||
|
||
async function loadRecords(isLoadMore = false) {
|
||
if (loading) return
|
||
loading = true
|
||
try {
|
||
const res = await fetchFn({ page, pageSize })
|
||
const list = res.data?.records || res.data || []
|
||
if (isLoadMore) {
|
||
records.push(...list)
|
||
} else {
|
||
records.length = 0
|
||
records.push(...list)
|
||
}
|
||
noMore = list.length < pageSize
|
||
} finally {
|
||
loading = false
|
||
}
|
||
}
|
||
|
||
async function loadMore() {
|
||
if (noMore || loading) return
|
||
page++
|
||
await loadRecords(true)
|
||
}
|
||
|
||
function reset() {
|
||
page = 1
|
||
noMore = false
|
||
records.length = 0
|
||
}
|
||
|
||
return { loadRecords, loadMore, reset, getPage: () => page, getRecords: () => records }
|
||
}
|
||
|
||
describe('Property 11: 分页加载参数正确性', () => {
|
||
/**
|
||
* **Feature: mobile-app, Property 11: 分页加载参数正确性**
|
||
* **Validates: Requirements 8.4**
|
||
*
|
||
* 对于任意连续N次加载更多操作,
|
||
* 第i次请求的page参数应等于1+i(初始页码为1)。
|
||
*/
|
||
it('连续加载更多时page参数应递增', async () => {
|
||
// 生成加载更多次数(1到10次)
|
||
const loadCountArb = fc.integer({ min: 1, max: 10 })
|
||
const pageSizeArb = fc.constantFrom(10, 20, 50)
|
||
|
||
await fc.assert(
|
||
fc.asyncProperty(loadCountArb, pageSizeArb, async (loadCount, pageSize) => {
|
||
// 记录每次请求的page参数
|
||
const requestedPages = []
|
||
|
||
// 模拟API函数:返回满页数据以确保不会触发noMore
|
||
const mockFetch = vi.fn(async (params) => {
|
||
requestedPages.push(params.page)
|
||
// 返回满页数据,确保可以继续加载
|
||
const fakeRecords = Array.from({ length: pageSize }, (_, i) => ({
|
||
id: `${params.page}-${i}`,
|
||
source: '测试',
|
||
amount: 10,
|
||
createdAt: '2025-01-01'
|
||
}))
|
||
return { data: { records: fakeRecords } }
|
||
})
|
||
|
||
const loader = createPaginationLoader(mockFetch, pageSize)
|
||
|
||
// 初始加载(page=1)
|
||
await loader.loadRecords()
|
||
|
||
// 连续加载更多N次
|
||
for (let i = 0; i < loadCount; i++) {
|
||
await loader.loadMore()
|
||
}
|
||
|
||
// 验证:总共请求了 1(初始) + loadCount 次
|
||
expect(requestedPages.length).toBe(1 + loadCount)
|
||
|
||
// 验证:第i次请求的page参数应等于i+1
|
||
for (let i = 0; i < requestedPages.length; i++) {
|
||
expect(requestedPages[i]).toBe(i + 1)
|
||
}
|
||
}),
|
||
{ numRuns: 100 }
|
||
)
|
||
})
|
||
})
|