I have the following method:
def save(entity: A): Either[List[Error],A] + {....
which I want to test using specs2
I want to test for the existence of a specific error when a required field is not specified, like this:
val noNickname = User(
nickname = "",
name = "new name",
)
noNickname.save must beLeft.like {
case errors => {
atLeastOnceWhen(errors) {
case error => {
error.errorCode must equalTo(Error.REQUIRED)
error.field must equalTo("nickname")
}
}
}
}
It works fine, but I’d like to define my own matcher to make it less verbose, like this:
noNickname.save must haveError.like {
case error => {
error.errorCode must equalTo(Error.REQUIRED)
error.field must equalTo("nickname")
}
}
}
I had a look at the documentation (http://etorreborre.github.com/specs2/guide/org.specs2.guide.Matchers.html#Matchers) but I can’t figure out how to define a custom matcher like haveError.like
Here your code with a few changes to make it compile:
Notice that the matcher is defined on
Either[List[T], _]everywhere.I’m also wondering about the failure messages that are returned in case you don’t find the expected error message, they might not be very explicit when the partial function fails.
So you may want to aim for using a contain matcher. Like this:
[Update]
The first solution (using
atLeastOnceWhenand a partial function) can be combined with the second one (using an implicit) and thebeLikematcher, to get maximum reusability of existing specs2 code: