期望Seq中的所有元素在specs2中抛出异常

时间:2015-11-01 01:09:32

标签: scala specs2

如果验证失败,我想通过抛出User来执行对IllegalArgumentException类'构造函数的参数的一些基本验证。在这种情况下,它是我想要验证的电子邮件地址。

为了测试验证,我想测试几个有效的电子邮件地址,并期望它们的 none 导致抛出异常。我还想测试一些无效的电子邮件地址,并期望所有导致异常被抛出。

到目前为止,这是我的代码,对于无效的电子邮件地址:

def throwException = throwAn[IllegalArgumentException].like {
  case e => e.getMessage must contain("Invalid email")
}

Seq(
  new User("Valid name", "joe@@multipleAtSigns.com"),
  new User("Valid name", "a?<bunch>[of]special{characters}@validdomain.tld"),
  new User("Valid name", "withoutanyatsign"),
  new User("Valid name", "123@456.789NumbersInTLD"),
  new User("Valid name", "recepientWithoutDomain@"),
  new User("Valid name", "@NoRecepient")
) must contain(throwException).foreach

我将它们放在Seq中的原因只是方便;我不想在每次之后写must throwException,如下所示:

new User("Valid name", "joe@@multipleAtSigns.com") must throwException
new User("Valid name", "a?<bunch>[of]special{characters}@validdomain.tld") must throwException
new User("Valid name", "withoutanyatsign") must throwException
new User("Valid name", "123@456.789NumbersInTLD") must throwException
new User("Valid name", "recepientWithoutDomain@") must throwException
new User("Valid name", "@NoRecepient") must throwException

我的问题是我在运行测试时遇到错误,这是由抛出的异常引起的:

[error]    java.lang.IllegalArgumentException: Invalid email: joe@@multipleAtSigns.com (User.scala:16)

所以问题是我实际上期望抛出上面的异常,并且我希望我的测试考虑抛出的异常成功,而不是测试错误。

我可以理解为什么测试错误,所以我基本上想知道是否有任何解决方法。或许我误解了Traversable上的匹配者是如何运作的?

1 个答案:

答案 0 :(得分:0)

可遍历的匹配器假设他们正在评估的集合本身不会抛出异常。这是这种情况,因为放在Seq中的一些(或所有)用户将抛出异常。以下内容适用:

Seq(
  () => new User("Valid name", "joe@@multipleAtSigns.com"),
  () => new User("Valid name", "a?<bunch>[of]special{characters}@validdomain.tld"),
  () => new User("Valid name", "withoutanyatsign"),
  () => new User("Valid name", "123@456.789NumbersInTLD"),
  () => new User("Valid name", "recepientWithoutDomain@"),
  () => new User("Valid name", "@NoRecepient")
) must contain((u: (() => User)) => u() must throwException).foreach

但我建议您将验证方法放在User类之外,以使User类保持纯净状态:

def validate(u: User): Unit = 
  // do the validation 
  ???

我实际上建议完全避免异常并为Users

设置“智能”构造函数
// you don't even need exceptions :-)
def user(name: String, email: String): Either[UserCreationError, User] = 
  ???