回到我們的目標
我們希望能測試 updateUsersTags()
,傳入參數 filter
時,會執行到該參數。並成功的將該參數處理後的 tag
加到 user
內。
這邊我們命名這個情境為 測試成功使用 filter 參數的回傳值()
那麼,我們怎麼在不使用到 removeTag()
函數的狀況下,測試出這個情境呢?
首先,我們先宣告一個自己的 stub filterStub
val target = makeTestTags(1)
val filterStub: List<Tag>.() -> List<Tag> = { target }
filterStub()
被呼叫之後,固定只會回傳 target
接著,我們設定進行測試狀況如下
val (testUser) = makeTestUsers(1)
val (testTag) = makeTestTags(1)
updateUsersTags(
listOf(testUser),
listOf(testTag),
filterStub
)
設定的方式和之前並沒有太大差異。
如果順利呼叫到 filterStub
的話,我們會預期 testUser.tags
裡面不會有 testTag
,但是會剛好等於 target
assertThat(testUser.tags.toList(), not(hasItem(testTag)))
assertThat(testUser.tags.toList(), `is`(target))
整體測試看起來是這樣
@Test
fun `測試成功使用 filter 參數的回傳值`() {
initDatabase()
transaction {
val target = makeTestTags(1)
val filterStub: List<Tag>.() -> List<Tag> = { target }
val (testUser) = makeTestUsers(1)
val (testTag) = makeTestTags(1)
updateUsersTags(
listOf(testUser),
listOf(testTag),
filterStub
)
assertThat(testUser.tags.toList(), not(hasItem(testTag)))
assertThat(testUser.tags.toList(), `is`(target))
}
}
運行測試之後,如果順利的話,我們會發現案例成功通過,我們針對 updateUsersTags()
的一個單元測試就大功告成囉!