[Day 23] 撰写我们的第一个 test double

回到我们的目标

我们希望能测试 updateUsersTags(),传入参数 filter时,会执行到该参数。并成功的将该参数处理後的 tag 加到 user 内。

这边我们命名这个情境为 测试成功使用 filter 参数的回传值()

那麽,我们怎麽在不使用到 removeTag() 函数的状况下,测试出这个情境呢?

宣告 stub

首先,我们先宣告一个自己的 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() 的一个单元测试就大功告成罗!


<<:  第 13 天 长痛不如短痛!整理专案|feature module、shared module

>>:  视觉化平台规划

认识网页元素 HTML、CSS

看完了前几天制作网页,所需要的素材、使用编辑器及制作网站的流程後後,今天要来介绍HTML、CSS的基...

Day15 Vue directives(v-for)下

昨天我们知道v-for的使用方式後那我们就来想一个问题,如果我们遇到渲染不只一组呢? 假设一个h3和...

菜鸡用 Phaser 拾起童年游戏 30

嗨嗨嗨~大家好!到了我们铁人赛的最後一天了,也意味着我们将要分别了QQ 希望这些内容有让大家可以学习...

[DAY19] 用 Azure Machine Learning SDK 建立 Datastore

DAY19 用 Azure Machine Learning SDK 建立 Datastore 我们...

Day 30 - 结语 : 从"预见到坚持"

终於来到今年铁人赛的最後一篇了~虽然都有预先写稿的习惯与准备, 但这次还真的是忙到最後一天才能抽空...