如何比较结果类型是抽象类的子类来匹配?

时间:2015-01-25 03:35:31

标签: scala inheritance matcher specs2

我有一个带签名的方法

def save(u: User): Future[Option[UserServiceError]]

我想用Specs2进行测试。

我有以下类型层次结构:

abstract class UserServiceError(message: String)
object UserAlreadyExist extends UserServiceError("User already exists")

然后,测试代码如下所示:

users.save(...) must beSome(users.UserAlreadyExist).await

所以我希望匹配器beSome能够理解UserAlreadyExist是方法签名中UserServiceError的子类型。

但是,它给了我一个编译时类型检查错误

type mismatch;
[error]  found   : org.specs2.matcher.Matcher[scala.concurrent.Future[Option[core.model.services.UserService#UserAlreadyExist.type]]]
[error]  required: org.specs2.matcher.Matcher[scala.concurrent.Future[Option[core.model.services.UserService#UserServiceError]]]

我有一种想法,我想念一些非常基本的东西,例如UserAlreadyExist.type不应该与UserServiceError[without .type]一致。

我在哪里做错了?

1 个答案:

答案 0 :(得分:2)

我没有考虑到您可以在beSome()内部使用匹配器,因此下一个更改测试代码有效(请参阅 beEqualTo ):

must beSome(beEqualTo(UserService.UserAlreadyExist)).await

我也将UserServiceError移动到了UserService的伴随对象中。