2017-11-08 31 views
13

Tôi đang cố gắng để đơn vị kiểm tra một coroutine Kotlin sử dụng delay(). Đối với các bài kiểm tra đơn vị tôi không quan tâm đến các delay(), nó chỉ làm chậm kiểm tra xuống. Tôi muốn chạy thử nghiệm theo cách nào đó không thực sự trì hoãn khi gọi delay().Đơn vị thử nghiệm một coroutine Kotlin với sự chậm trễ

Tôi cố gắng chạy coroutine sử dụng một bối cảnh tùy chỉnh mà các đại biểu để CommonPool:

class TestUiContext : CoroutineDispatcher(), Delay { 
    suspend override fun delay(time: Long, unit: TimeUnit) { 
     // I'd like it to call this 
    } 

    override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) { 
     // but instead it calls this 
    } 

    override fun dispatch(context: CoroutineContext, block: Runnable) { 
     CommonPool.dispatch(context, block) 
    } 
} 

Tôi đã hy vọng tôi chỉ có thể trở lại từ phương pháp bối cảnh của tôi delay(), nhưng thay vào đó nó đang gọi phương pháp scheduleResumeAfterDelay() của tôi, và tôi don' t biết cách ủy quyền cho trình lập lịch mặc định.

+0

Bạn không thể chỉ định thời gian chờ trì hoãn có thể định cấu hình để trong bài kiểm tra của mình, bạn có thể chọn một bản rất nhỏ? – s1m0nw1

+0

@ s1m0nw1 Có, nhưng tôi muốn có một giải pháp chung, và không phải sửa đổi mã của tôi như thế. –

+0

@eoinmullan, Bạn có thể chia sẻ một dự án git tối thiểu cho giống nhau không? –

Trả lời

7

Nếu bạn không muốn bất kỳ chậm trễ, tại sao bạn không chỉ đơn giản là tiếp tục việc tiếp tục có cuộc gọi lịch ?:

class TestUiContext : CoroutineDispatcher(), Delay { 
    override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) { 
     continuation.resume(Unit) 
    } 

    override fun dispatch(context: CoroutineContext, block: Runnable) { 
     //CommonPool.dispatch(context, block) // dispatch on CommonPool 
     block.run() // dispatch on calling thread 
    } 
} 

Bằng cách đó delay() sẽ tiếp tục không có sự chậm trễ. Lưu ý rằng đây vẫn tạm ngưng tại chậm trễ, vì vậy coroutines khác vẫn có thể chạy (như yield())

@Test 
fun `test with delay`() { 
    runBlocking(TestUiContext()) { 
     launch { println("launched") } 
     println("start") 
     delay(5000) 
     println("stop") 
    } 
} 

Chạy không chậm trễ và in:

start 
launched 
stop 

EDIT:

Bạn có thể kiểm soát nơi sự tiếp tục được chạy bằng cách tùy chỉnh hàm dispatch.

+0

Và 'dispatch()' chỉ có thể là 'block.run()', giữ cho thực thi trong luồng chính. –

+0

Đúng, và điều đó có thể có ý nghĩa để thử nghiệm, mặc dù ông dường như muốn sử dụng CommonPool. – bj0

+0

Tôi là OP và tôi muốn sử dụng cùng một chuỗi. Thực hiện thay đổi và tôi sẽ chấp nhận câu trả lời của bạn. –

Các vấn đề liên quan