#1030 의 `feature/timeletter/domain` 몫이다. **3종 10벌 → 3벌.** | 계약 | 벌 수 | |---|---| | `TimeLetterRepository` | 4 | | `FileMetadataRepository` | 3 | | `ReceiverTimeLetterRepository` | 3 | `ReceiverTimeLetterRepository` 는 이름과 달리 `feature/timeletter/domain` 에 있고 소비처는 `feature/receiver/presentation` 이다 — 픽스처는 계약이 있는 쪽(timeletter)에 둔다. ## 규약 픽스처 규약은 #1030 에 정본이 있고 첫 적용은 #1040 이다. 그대로 따른다. - 기본 동작은 **메모리 저장소**, 호출은 전부 기록해 테스트가 사후에 단언한다. - 저장소 동작으로 표현 못 하는 시나리오(경합용 게이트, 스크립트된 실패)는 `onX` 람다로 갈아끼운다. - "이 시나리오에서 호출되면 안 됨" 은 `strict()` + `unexpectedCall(...)` 로 옮긴다. 기본 동작이 관대해져 경계가 사라지지 않게 한다. - 스크립트 큐는 픽스처에 넣지 않는다 — 호출부에서 `ArrayDeque` 를 들고 `onX` 로 물린다. - **단언 자체는 바꾸지 않는다.** 기록 접근자 이름이 달라지는 것까지만 허용하고, 의미가 바뀌어야 한다면 별건으로 분리한다. ## 완료 기준 - 이 모듈의 계약별 fake 가 `src/testFixtures` 정본 1벌(+시나리오 파라미터)로 접힌다. - 계약에 메서드를 추가하면 `:<모듈>:compileDebugTestFixturesKotlin` 이 실패하는 것을 실측한다. - `:koverXmlReportCi` `:konsist:test` `:app:compileDebugAndroidTestKotlin` `ktlintCheck` 통과.
Activity
1hyok commentedon Aug 24, 2026
담당 모듈 경계(타임레터 = @koongmai)에 따라 어사인을 넘깁니다. 본문의 계약별 벌 수 집계와 픽스처 규약은 그대로 유효하고, 규약 정본은 #1030, 첫 적용 사례는 PR #1040 입니다.
#1030 이 걸어 둔 순서(#1045 → #1041 → #1042 → #1043 → #1044)는
app/src/androidTest의 같은 파일을 여러 배치가 건드리기 때문입니다. 앞 배치가 닫힌 뒤 착수하시면 됩니다.[-]test(timeletter): TimeLetter·FileMetadata·ReceiverTimeLetter fake 10벌을 testFixtures 3벌로[/-][+]TimeLetter·FileMetadata·ReceiverTimeLetter fake 10벌을 testFixtures 3벌로[/+]Merge pull request #1340 from Afternote/test/1043-timeletter-test-fix…