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 } ) }) })