From 7170a496648c9a61f8d32ebb23bcadcc6ca2251e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=94=E9=B2=81=E6=AD=A3?= <13780741225@163.com> Date: Thu, 10 Sep 2026 11:32:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B6=E7=AA=84=20SettingRow=20?= =?UTF-8?q?=E5=8F=AF=E8=A7=81=E6=80=A7=E5=B9=B6=E5=BC=BA=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=20ViewModel=20=E6=B5=8B=E8=AF=95=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=AE=A1=E7=BA=BF=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ringhealth/feature/device/DeviceScreen.kt | 2 +- .../feature/device/DeviceViewModelTest.kt | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/placeholder/ringhealth/feature/device/DeviceScreen.kt b/app/src/main/java/com/placeholder/ringhealth/feature/device/DeviceScreen.kt index 6dbb58d..9be0a7d 100644 --- a/app/src/main/java/com/placeholder/ringhealth/feature/device/DeviceScreen.kt +++ b/app/src/main/java/com/placeholder/ringhealth/feature/device/DeviceScreen.kt @@ -126,7 +126,7 @@ private fun DeviceInfoCard(state: DeviceUiState, modifier: Modifier = Modifier) /** 单行设置项(只读展示,开关在详情页操作)。 */ @Composable -internal fun SettingRow(setting: DeviceFunctionSetting, modifier: Modifier = Modifier) { +private fun SettingRow(setting: DeviceFunctionSetting, modifier: Modifier = Modifier) { HealthCard(modifier = modifier) { Row( modifier = Modifier.fillMaxWidth(), diff --git a/app/src/test/java/com/placeholder/ringhealth/feature/device/DeviceViewModelTest.kt b/app/src/test/java/com/placeholder/ringhealth/feature/device/DeviceViewModelTest.kt index 2a60c78..e83ef18 100644 --- a/app/src/test/java/com/placeholder/ringhealth/feature/device/DeviceViewModelTest.kt +++ b/app/src/test/java/com/placeholder/ringhealth/feature/device/DeviceViewModelTest.kt @@ -33,8 +33,9 @@ class DeviceViewModelTest { } @Test - fun `输出设备状态与五个功能开关`() = runTest(dispatcher) { - val viewModel = DeviceViewModel(MockRingDeviceRepository()) + fun `输出设备状态与五个功能开关,且仓库变化会回流到 UI 状态`() = runTest(dispatcher) { + val repository = MockRingDeviceRepository() + val viewModel = DeviceViewModel(repository) backgroundScope.launch { viewModel.uiState.collect {} } advanceUntilIdle() @@ -43,6 +44,14 @@ class DeviceViewModelTest { assertEquals(78, state.device.batteryPercent) assertEquals("1.0.5", state.device.firmwareVersion) assertEquals(5, state.settings.size) + + // 上面三个值恰好与 stateIn 的 initialValue 相同(DeviceViewModel 的 initialValue + // 直接取仓库当前值),所以**单靠它们无法区分「combine 发射过」与「一直停在 initialValue」** + // (ledger Ruling R30,审查者指出)。这里绕开 ViewModel 直接改仓库,再断言状态跟着变 —— + // 只有 combine 真的在发射,这一条才可能成立。 + repository.setFunctionEnabled("stress", true) + advanceUntilIdle() + assertTrue(viewModel.uiState.value.settings.first { it.id == "stress" }.enabled) } @Test