问题描述
我想要一个周期性的计时器循环(例如1秒间隔)。有很多方法可以做到这一点,但是我还没有找到适合单元测试的解决方案。
- 计时器应该精确
- 单元测试应该能够跳过等待状态
我最接近解决方案的是使用协程:使用[Fact]
public void CanCheckAllInOneGo()
{
varerror = false;
foreach (var a in TestData())
{
error |= doSomething((bool)a[0],(bool)a[1]);
}
Assert.True(error != true,"doSomething() Failed");
}
,task loadDependencies(type: Exec) {
doLast {
configurations.each { config -> config.files() }
}
}
和delay
的简单循环。
runBlockingTest
和
advanceTimeBy
它在某种程度上可以工作,但是计时器不精确,因为它不考虑执行时间。
我没有找到一种方法来查询协程范围中使用的内部计时器或coScope.launch {
while (isActive) {
// do stuff
delay(1000L)
}
}
中的剩余超时值:
@Test
fun timer_test() = coScope.runBlockingTest {
... // start job
advanceTimeBy(9_000L)
... // cancel job
}
下一个想法是使用withTimeoutOrNull
:
coScope.launch {
withTimeoutOrNull(999_000_000L) { // max allowed looping time
while (isActive) {
// do stuff
val timeoutLeft // How to get that value ???
delay(timeoutLeft.mod(1000L))
}
}
}
但是,ticker
和coScope.launch {
val tickerChannel = ticker(1000L,0L,coroutineContext)
var referenceTimer = 0L
for (event in tickerChannel) {
// do stuff
println(referenceTimer)
referenceTimer += 1000L
}
}
之间的连接不会产生正确的结果:
TestCoroutinedispatcher()
一致地导致:
ticker
我也愿意接受满足上述两点的其他方法。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)