raniejade
05/21/2017, 12:16 PMrobfletcher
05/22/2017, 3:39 PMsubject {}
block in another spec that wants to use itBehavesLike
so that it can be used by the constructor of the class-under-testrobfletcher
05/22/2017, 3:40 PMSubjectSpek
https://github.com/spinnaker/orca/blob/master/orca-queue/src/test/kotlin/com/netflix/spinnaker/orca/q/QueueSpec.kt#L31-L35robfletcher
05/22/2017, 3:42 PMrobfletcher
05/22/2017, 3:43 PMdeadLetterCallback
which is created and managed by QueueSpec
to the constructor of RedisQueue
if I was using a subject
block there.robfletcher
05/22/2017, 3:44 PMQueueSpec
an abstract class and RedisQueueSpec
extend it but this seems to be exactly the kind of case itBehavesLike
is designed for.raniejade
05/23/2017, 2:26 AMitBehavesLike
). The included spec doesn't really now if it's used that way. I know there's currently a bug with itBehavesLike
- going to release the fix today.raniejade
05/23/2017, 2:32 AMabstract class QueueSpec: SubjectSpek<Queue>({
...
})
object RedisQueueSpec: SubjectSpek<RedisQueue>({
subject {
RedisQueue(...)
}
// i know it's ugly, but we need to mark it as abstract
// so spek will ignore it.
// this will be fix when we add `@IgnoreSpek` <https://github.com/JetBrains/spek/issues/200>
// itBehavesLike(QueueSpec)
itBehavesLike(object: QueueSpec() {})
})
robfletcher
05/23/2017, 4:10 PMrobfletcher
05/23/2017, 4:11 PMraniejade
05/24/2017, 1:32 AMrobfletcher
06/02/2017, 11:54 AMraniejade
06/02/2017, 1:14 PMrobfletcher
06/02/2017, 1:16 PMrobfletcher
06/02/2017, 1:17 PMrobfletcher
06/02/2017, 1:17 PMrobfletcher
06/02/2017, 1:18 PMitBehavesLike
to construct its subject appropriatelyraniejade
06/05/2017, 6:40 AMabstract class QueueSpec(collaborator1: Mock): SubjectSpek<Queue>({
... // mock collaborator1
})
object RedisQueueSpec: SubjectSpek<RedisQueue>({
subject {
RedisQueue(collaborator1)
}
// i know it's ugly, but we need to mark it as abstract
// so spek will ignore it.
// this will be fix when we add `@IgnoreSpek` <https://github.com/JetBrains/spek/issues/200>
// itBehavesLike(QueueSpec)
itBehavesLike(object: QueueSpec(collaborator1) {})
})
robfletcher
06/05/2017, 2:26 PMcollaborator1
raniejade
06/05/2017, 11:58 PMrobfletcher
06/05/2017, 11:59 PMraniejade
06/06/2017, 12:00 AMrobfletcher
06/07/2017, 1:12 PMraniejade
06/08/2017, 4:08 AMrobfletcher
06/08/2017, 4:41 PMitBehavesLike
. But I can’t think of many scenarios where I would want to use that and wouldn’t also be passing things to the subject constructorraniejade
06/09/2017, 2:56 AMinterface Collaborator: () -> Unit {
fun reset()
fun isInvoked(): Boolean
}
open class Thing(protected val fn: () -> Unit) {
fun doIfEven(n: Int) {
if (n % 2 == 0) fn()
}
}
@IgnoreSpek
object ThingSpec: SubjectSpek<Thing>({
val mockFn by memoized()
// subject {
// constructor of subject depends on collaborator
// Thing(mockFn)
//}
describe("doIfEven") {
given("an even parameter") {
afterGroup(mockFn::reset)
on("calling doIfEven") {
subject.doIfEven(2)
}
it("invokes the function") {
assertTrue("mock was not invoked", mockFn.invoked)
}
}
given("an odd parameter") {
afterGroup(mockFn::reset)
on("calling doIfEven") {
subject.doIfEven(1)
}
it("does not invoke the function") {
assertFalse("mock should not have been invoked", mockFn.invoked)
}
}
}
})
class ExtendedThing(fn: () -> Unit) : Thing(fn)
class ExtendedThingSpec : SubjectSpek<ExtendedThing>({
val mockFn by memoized {
object : Collaborator {
var invoked = false
override fun invoke() {
invoked = true
}
override fun reset() {
invoked = false
}
override fun isInvoked() = invoked
}
}
subject {
ExtendedThing(mockFn)
}
itBehavesLike(ThingSpec)
})