android - 使用turtle测试协程StateFlow的更好方法是什么
问题描述
我正在寻找一种更好的方法来测试协程。目前,我正在使用Turbine作为测试助手。但是,我在改善超时问题时遇到了一些困难。
前任:
class RepositoryTest {
@get:Rule
val rule = InstantTaskExecutorRule()
private lateinit var sut: SubjectToTest
private val testDispatchers = TestDispatchersProvider.dispatchers
private val mockAddressRepository = mockk<AddressRepository>(relaxed = true)
private val mockApiService = mockk<ApiService>(relaxed = true)
private val mockCardsRepository = mockk<CardsRepository>(relaxed = true)
@Before
fun setup() {
sut = SutRepository(
apiService = mockApiService,
dispatchersProvider = testDispatchers,
restCallHandler = testRestCallHandler,
addressRepo = mockAddressRepository,
cardRepo = mockCardsRepository,
)
}
@After
fun tearDown() {
unmockkAll()
}
private val mockCardResponse = CardResponse(
data = DataModel(
listOf(
...
)
)
)
@Test
fun `fetchData has success response then return Data`() = runBlockingTest {
// Given
coEvery {
mockAddressService.fetchAddresss(any(), any(), any(), any(), any(), any(), any())
} returns Response.success(mockCardResponse)
every {
mockCardsRepository.fetchCard
} returns mockFlow()
testRestCallHandler.callResult = ...
// Test
sut.fetchMessages(true)
sut.StateFlow.test {
expectItem().assertObject{ ... }
expectItem().assertSize(1)
}
}
}
上面的代码有TimeoutCancellationException。
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1000 ms
at |b|b|b(Coroutine boundary.|b(|b)
通过解决上述问题,我在测试中移动了类初始化。
@Test
fun `fetchData has success response then return Data`() = runBlockingTest {
// Given
coEvery {
mockAddressService.fetchAddresss(any(), any(), any(), any(), any(), any(), any())
} returns Response.success(mockCardResponse)
every {
mockCardsRepository.fetchCard
} returns mockFlow()
testRestCallHandler.callResult = ...
// Test
sut = SutRepository(
apiService = mockApiService,
dispatchersProvider = testDispatchers,
restCallHandler = testRestCallHandler,
addressRepo = mockAddressRepository,
cardRepo = mockCardsRepository,
)
sut.fetchMessages(true)
sut.StateFlow.test {
expectItem().assertType<List<DataMode;>> {
this.assertListSize(1)
}
cancel()
}
}
在测试中移动初始化后,测试通过但我正在寻找一种改进它的方法。
解决方案
推荐阅读
- angular - 将具有背景颜色的 Excel 工作表中的数据导出到标题行
- sql-server - 如何使用 sql 查询在两个不同的模式中删除具有相同名称的表
- django - 使用任何来源的 Django Rest API
- node.js - where 子句不适用于环回中的特殊字符
- matlab - 在 Matlab 中引导数据集进行集成学习
- codeigniter - 如何在 Codeignighter 中阻止用户在生产环境中访问我的文件
- search - HTML 或 PHP 代码 - 按序列号搜索框
- node.js - Multer 上传具有不同名称且无扩展名的二进制文件而不是原始文件
- javascript - 运行 Casper.js 时,错误 undefined is not a constructor (evalating 'require('webpage').create()')
- c - 通过 PCIe 连接的两台 Linux 机器之间的低数据速率