如果验证失败,我想通过抛出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
上的匹配者是如何运作的?
答案 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] =
???