trait HavePropertyMatcher[-T, P] extends (T) => HavePropertyMatchResult[P]
Trait extended by matcher objects, which may appear after the word have
, that can match against a
property of the type specified by the HavePropertyMatcher
's second type parameter P
.
HavePropertyMatcher
's first type parameter, T
, specifies the type that declares the property. The match will succeed if and
only if the value of the property equals the specified value.
The object containing the property
is passed to the HavePropertyMatcher
's
apply
method. The result is a HavePropertyMatchResult[P]
.
A HavePropertyMatcher
is, therefore, a function from the specified type, T
, to
a HavePropertyMatchResult[P]
.
Although HavePropertyMatcher
and Matcher
represent similar concepts, they have no inheritance relationship
because Matcher
is intended for use right after should
or must
whereas HavePropertyMatcher
is intended for use right after have
.
A HavePropertyMatcher
essentially allows you to write statically typed
property assertions similar to the dynamic ones that use symbols:
book should have ('title ("Moby Dick")) // dynamic: uses reflection book should have (title ("Moby Dick")) // type safe: only works on Books; no reflection used
One good way to organize custom matchers is to place them inside one or more traits that
you can then mix into the suites or specs that need them. Here's an example that
includes two methods that produce HavePropertyMatcher
s:
case class Book(val title: String, val author: String)
trait CustomMatchers {
def title(expectedValue: String) = new HavePropertyMatcher[Book, String] { def apply(book: Book) = HavePropertyMatchResult( book.title == expectedValue, "title", expectedValue, book.title ) }
def author(expectedValue: String) = new HavePropertyMatcher[Book, String] { def apply(book: Book) = HavePropertyMatchResult( book.author == expectedValue, "author", expectedValue, book.author ) } }
Each time the title
method is called, it returns a new HavePropertyMatcher[Book, String]
that
can be used to match against the title
property of the Book
passed to its apply
method. Because the type parameter of these two HavePropertyMatcher
s is Book
, they
can only be used with instances of that type. (The compiler will enforce this.) The match will succeed if the
title
property equals the value passed as expectedValue
.
If the match succeeds, the matches
field of the returned HavePropertyMatchResult
will be true
.
The second field, propertyName
, is simply the string name of the property.
The third and fourth fields, expectedValue
and actualValue
indicate the expected and actual
values, respectively, for the property.
Here's an example that uses these HavePropertyMatchers
:
class ExampleSpec extends RefSpec with Matchers with CustomMatchers {
describe("A book") {
it("should have the correct title and author") {
val book = Book("Moby Dick", "Melville")
book should have ( title ("Moby Dick"), author ("Melville") ) } } }
These matches should succeed, but if for example the first property, title ("Moby Dick")
, were to fail, you would get an error message like:
The title property had value "A Tale of Two Cities", instead of its expected value "Moby Dick", on object Book(A Tale of Two Cities,Dickens)
For more information on HavePropertyMatchResult
and the meaning of its fields, please
see the documentation for HavePropertyMatchResult
. To understand why HavePropertyMatcher
is contravariant in its type parameter, see the section entitled "Matcher's variance" in the
documentation for Matcher
.
- Self Type
- HavePropertyMatcher[T, P]
- Source
- HavePropertyMatcher.scala
- Alphabetic
- By Inheritance
- HavePropertyMatcher
- Function1
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Abstract Value Members
- abstract def apply(objectWithProperty: T): HavePropertyMatchResult[P]
Check to see if a property on the specified object,
objectWithProperty
, matches its expected value, and report the result in the returnedHavePropertyMatchResult
.Check to see if a property on the specified object,
objectWithProperty
, matches its expected value, and report the result in the returnedHavePropertyMatchResult
. TheobjectWithProperty
is usually the value to the left of ashould
ormust
invocation. For example,book
would be passed as theobjectWithProperty
in:book should have (title ("Moby Dick"))
- objectWithProperty
the object with the property against which to match
- returns
the
HavePropertyMatchResult
that represents the result of the match
- Definition Classes
- HavePropertyMatcher → Function1
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def andThen[A](g: (HavePropertyMatchResult[P]) => A): (T) => A
- Definition Classes
- Function1
- Annotations
- @unspecialized()
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- def compose[U](g: (U) => T): HavePropertyMatcher[U, P]
Compose this
HavePropertyMatcher
with the passed function, returning a newHavePropertyMatcher
.Compose this
HavePropertyMatcher
with the passed function, returning a newHavePropertyMatcher
.This method overrides
compose
onFunction1
to return a more specific function type ofHavePropertyMatcher
.- Definition Classes
- HavePropertyMatcher → Function1
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- Function1 → AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()