Loading...
Loading...
Compare original and translation side by side
expect(result.id).toBe(activeOrder.id)expect(result.id).toBe('123')expect(result.id).toBe(activeOrder.id)expect(result.id).toBe('123')import { faker } from "@faker-js/faker";
import { FileContext } from "../types";
export function buildFileFromIDE(overrides: Partial<FileContext> = {}): FileContext {
return {
path: faker.system.filePath(),
type: faker.helpers.arrayElement(["file", "folder"]),
...overrides,
};
}
import { faker } from "@faker-js/faker";
import { FileContext } from "../types";
export function buildFileFromIDE(overrides: Partial<FileContext> = {}): FileContext {
return {
path: faker.system.filePath(),
type: faker.helpers.arrayElement(["file", "folder"]),
...overrides,
};
}
expect(response).toEqual([{id: '123'}, {id: '456'}])expect(response).not.toBeNull() // redundant
expect(Array.isArray(response)).toBe(true) // redundant
expect(response.length).toBe(2) // redundant
expect(response[0].id).toBe('123') // redundantexpect(actualArray).toEqual(expectedArray)expect(actualArray.contains(expectedValue)).toBeTrue()expect(response).toEqual([{id: '123'}, {id: '456'}])expect(response).not.toBeNull() // 冗余
expect(Array.isArray(response)).toBe(true) // 冗余
expect(response.length).toBe(2) // 冗余
expect(response[0].id).toBe('123') // 冗余expect(actualArray).toEqual(expectedArray)expect(actualArray.contains(expectedValue)).toBeTrue()await expect(locator).toContainText('some string');await expect(locator).toContainText('some string');await api.delete('/order/123')await api.get('/order/456')expect(response).toMatchObject({ id: expect.any(Number), createdAt: expect.any(String) }){ email: }await api.post('/order', newOrder)await api.get('/order/${id}')await api.delete('/order/123')await api.get('/order/456')expect(response).toMatchObject({ id: expect.any(Number), createdAt: expect.any(String) }){ email: }await api.post('/order', newOrder)await api.get('/order/${id}')// BAD TEST EXAMPLE - Violates multiple best practices
it('should test orders report filtering functionality', async () => { // 👎🏻 violates A.1
const adminUser = { role: 'admin' } // 👎🏻 violates I.10
// Setting up mocks for internal implementation details
const mockOrderService = vi.fn() // 👎🏻 violates E.1
const mockFilterService = vi.fn() // 👎🏻 violates E.1
// Dummy meaningless data
const testData = [ // 👎🏻 violates C.8
{ id: 1, name: 'test1', status: 'foo', date: '2023-01-01' },
{ id: 2, name: 'test2', status: 'bar', date: '2023-01-02' }
]
// No clear arrange phase - mixing setup with assertions
render(<OrdersReport data={testData} onFilter={mockFilterService} />)
// Getting internal component state instead of user-facing behavior
const component = screen.getByTestId('orders-report') // 👎🏻 violates F.1
const internalState = component.querySelector('.internal-filter-state') // 👎🏻 violates F.1
try { // 👎🏻 violates A.13
const filterButton = screen.getByRole('button', { name: 'Filter Active' })
await userEvent.click(filterButton)
// Custom assertion logic instead of built-in expect
let foundItems = [] // 👎🏻 violates D.7
const rows = screen.getAllByRole('row')
for (const row of rows) { // 👎🏻 violates A.13, D.7
if (row.textContent?.includes('Active')) {
foundItems.push(row)
}
}
// Asserting data that was never arranged in the test
expect(foundItems.length).toBe(5) // 👎🏻 violates B.3, B.20
// Testing implementation details
expect(mockOrderService).toHaveBeenCalled() // 👎🏻 violates B.23
expect(internalState).toHaveClass('filtered-state') // 👎🏻 violates B.23
// Too many assertions
expect(component).toBeInTheDocument() // 👎🏻 violates A.10
expect(screen.getByText('Active Orders')).toBeVisible() // 👎🏻 violates A.10
expect(filterButton).toHaveAttribute('aria-pressed', 'true') // 👎🏻 violates A.10
expect(rows).toBeDefined() // 👎🏻 violates B.10, D.11
expect(rows).not.toBeNull() // 👎🏻 violates B.10, D.11
expect(rows.length).toBeGreaterThan(0) // 👎🏻 violates B.10, D.11
} catch (error) { // 👎🏻 violates A.13
console.log('Filter test failed:', error) // 👎🏻 violates A.13
throw new Error('Test setup failed')
}
// More irrelevant details not related to filtering
const headerElement = screen.getByRole('banner')
expect(headerElement).toHaveTextContent('Dashboard') // 👎🏻 violates B.5
}) // 👎🏻 violates A.3 (too many statements), A.5 (no clear AAA phases)// 反面测试示例 - 违反多项最佳实践
it('should test orders report filtering functionality', async () => { // 👎🏻 违反A.1
const adminUser = { role: 'admin' } // 👎🏻 违反I.10
// Mock内部实现细节
const mockOrderService = vi.fn() // 👎🏻 违反E.1
const mockFilterService = vi.fn() // 👎🏻 违反E.1
// 无意义的虚拟数据
const testData = [ // 👎🏻 违反C.8
{ id: 1, name: 'test1', status: 'foo', date: '2023-01-01' },
{ id: 2, name: 'test2', status: 'bar', date: '2023-01-02' }
]
// 无清晰的准备阶段 - 混合设置与断言
render(<OrdersReport data={testData} onFilter={mockFilterService} />)
// 获取内部组件状态而非用户可见行为
const component = screen.getByTestId('orders-report') // 👎🏻 违反F.1
const internalState = component.querySelector('.internal-filter-state') // 👎🏻 违反F.1
try { // 👎🏻 违反A.13
const filterButton = screen.getByRole('button', { name: 'Filter Active' })
await userEvent.click(filterButton)
// 使用自定义断言逻辑而非内置expect
let foundItems = [] // 👎🏻 违反D.7
const rows = screen.getAllByRole('row')
for (const row of rows) { // 👎🏻 违反A.13, D.7
if (row.textContent?.includes('Active')) {
foundItems.push(row)
}
}
// 断言测试中从未准备过的数据
expect(foundItems.length).toBe(5) // 👎🏻 违反B.3, B.20
// 测试实现细节
expect(mockOrderService).toHaveBeenCalled() // 👎🏻 违反B.23
expect(internalState).toHaveClass('filtered-state') // 👎🏻 违反B.23
// 断言数量过多
expect(component).toBeInTheDocument() // 👎🏻 违反A.10
expect(screen.getByText('Active Orders')).toBeVisible() // 👎🏻 违反A.10
expect(filterButton).toHaveAttribute('aria-pressed', 'true') // 👎🏻 违反A.10
expect(rows).toBeDefined() // 👎🏻 违反B.10, D.11
expect(rows).not.toBeNull() // 👎🏻 违反B.10, D.11
expect(rows.length).toBeGreaterThan(0) // 👎🏻 违反B.10, D.11
} catch (error) { // 👎🏻 违反A.13
console.log('Filter test failed:', error) // 👎🏻 违反A.13
throw new Error('Test setup failed')
}
// 与过滤无关的冗余细节
const headerElement = screen.getByRole('banner')
expect(headerElement).toHaveTextContent('Dashboard') // 👎🏻 违反B.5
}) // 👎🏻 违反A.3(语句过多), A.5(无清晰的AAA阶段)beforeEach(() => {
const currentUser = buildUser({ name: faker.person.fullName(), role: 'viewer' }) // 🔥 The deliberate fire principle
http.get('/api/user/1', () => HttpResponse.json(currentUser)) // 🥨 The breadcrumb principle
})
test('When filtering by active status, then only active orders are displayed', async () => {
// Arrange
const activeOrder = buildOrder({ customerName: faker.person.fullName(), status: 'active' })
const completedOrder = buildOrder({ customerName: faker.person.fullName(), status: 'non-active' }) // 🔫 The smoking gun principle
http.get('/api/orders', () => HttpResponse.json([activeOrder, completedOrder]))
const screen = render(<OrdersReport />)
// Act
await userEvent.click(screen.getByRole('button', { name: 'Filter by Active' }))
// Assert
expect.element(screen.getByRole('cell', { name: activeOrder.customerName })).toBeVisible()
expect.element(screen.getByRole('cell', { name: completedOrder.customerName })).not.toBeVisible() // 🚀 The extra mile principle
})beforeEach(() => {
const currentUser = buildUser({ name: faker.person.fullName(), role: 'viewer' }) // 🔥 极端场景测试原则
http.get('/api/user/1', () => HttpResponse.json(currentUser)) // 🥨 面包屑原则
})
test('When filtering by active status, then only active orders are displayed', async () => {
// Arrange
const activeOrder = buildOrder({ customerName: faker.person.fullName(), status: 'active' })
const completedOrder = buildOrder({ customerName: faker.person.fullName(), status: 'non-active' }) // 🔫 确凿证据原则
http.get('/api/orders', () => HttpResponse.json([activeOrder, completedOrder]))
const screen = render(<OrdersReport />)
// Act
await userEvent.click(screen.getByRole('button', { name: 'Filter by Active' }))
// Assert
expect.element(screen.getByRole('cell', { name: activeOrder.customerName })).toBeVisible()
expect.element(screen.getByRole('cell', { name: completedOrder.customerName })).not.toBeVisible() // 🚀 额外覆盖原则
})