Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Scala进行Akka演员单元测试_Scala_Testing_Akka_Actor_Specs - Fatal编程技术网

用Scala进行Akka演员单元测试

用Scala进行Akka演员单元测试,scala,testing,akka,actor,specs,Scala,Testing,Akka,Actor,Specs,我是Scala的新手,所以请温柔一点 在我目前正在构建的应用程序中,我正在使用Akka actors,我想编写一些单元测试。我遇到了这个 但我不能确切地理解它应该如何工作。特别是, val actorRef = TestActorRef(new MyActor) // hypothetical message stimulating a '42' answer val future = actorRef ? Say42 val Success(result: Int) = future.valu

我是Scala的新手,所以请温柔一点

在我目前正在构建的应用程序中,我正在使用Akka actors,我想编写一些单元测试。我遇到了这个

但我不能确切地理解它应该如何工作。特别是,

val actorRef = TestActorRef(new MyActor)
// hypothetical message stimulating a '42' answer
val future = actorRef ? Say42
val Success(result: Int) = future.value.get
result must be(42)
当我尝试这样做时,我得到了
未找到:value Success
,这并不奇怪

然后我发现

,虽然它可能已经很老了,但它很容易理解,更接近我在使用期货时通常使用的,而且最重要的是它很有效。它确实需要我声明一些隐含的东西,比如ActorSystem、timeout等等,而官方的方式似乎不是这样


如果可能的话,我希望使用官方文档中提出的方法,因此如果有人能帮助我了解它的工作原理(特别是成功的部分)以及如何使用它,我将不胜感激。

您的问题的答案可能太长,因为不可能知道您实际知道多少Scala。我将尽可能简短地回答,但请不要犹豫,随时要求澄清。我也代表整个stackoverflow社区向您道歉,因为在提问之前,您明显缺乏技巧,因此觉得有必要道歉

Scala 2.10引入了
Try
的概念。它非常类似于
选项
<代码>选项是一个处理
null
s的概念。
选项类型的值可以有两种形式:
Some(value)
None
。当您有一个
选项
al值时,您可以对其进行模式匹配,以查看它是
Some
还是
None
,然后相应地采取行动。模式匹配发生在Scala的许多地方,其中一个是在
val
s初始化期间。以下是几个例子:

val x = 10 // pattern 'x' on the LHS matches any value on the RHS so 'x' is initialized with 10
val Some(x) = Some(10) // pattern 'Some(x)' on the LHS matches any value of type 'Some' and binds it's value to x, so 'x' is yet again initialized with 10
Try
是处理异常的概念。
Try
类型的值可以有两种形式:
Success(result)
Failure(throwable)
。当您有一个类型为
Try
的值时,您可以对其进行模式匹配,以查看它是
成功
还是
失败

这就是代码中发生的情况(模式匹配在
Success
上)。与
选项
相反,
Try的两种形式默认不在范围内,这会导致编译错误。这将解决它:

import scala.util.{Try, Success, Failure}

首先,使用get on futures value不是一个好模式,如果出现故障,这可能会引发异常。您应该使用wait.result(如秒示例中所示),或者使用模式匹配来处理成功和失败:

future match {
  case Success(value) => // work with value
  case Failure(ex) => // work with exception
}
要使用
Success
Failure
导入
scala.util.\u
scala.util.{Success,Failure}


是最新版本2.2-M3的官方文档

让您的测试扩展TestKit,然后添加“with ImplicitSender”,然后您可以执行以下操作:

val yourActor = system.actorOf(Props[MyActor])
yourActor ! Say42
expectMsg(42)

您是否有类似于
scala.util.\u
scala.util.Success
的导入?很好的类比;我非常了解模式匹配和选项,并且能够跟进。我只是对尝试、成功和失败一无所知。我想Future.value.get会返回Try-then类型的值?换句话说,下面的例子:
val-futureValue=future.value.get-futureValue-match{case-Success(x:Int)=>x必须是(42)case\u=>false必须是(true)//just-fail}
上述方法在我的测试中适用:)是的,完全相同,但你绝对应该采用Viktor Klang建议的方法。谢谢,我会接受你的回答,因为它回答了我的问题,最能消除我对成功的困惑。谢谢,这真的很有帮助。经过一些搜索,我发现演示了如何将ImplicitSender与DefaultTimeout一起使用,等等。
val yourActor = system.actorOf(Props[MyActor])
yourActor ! Say42
expectMsg(42)