- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 Scala 应用程序中,假设我有 Actor A
和 Actor B
。我想在 ScalaTest 中设计一个测试用例,它允许我向 Actor A
发送消息,并查看它向 Actor B
发送什么消息,以便查看是否 A
正在正确处理其数据并向 B
发送正确的消息。如何测试这一点?我花了很长时间才自己把这个煮熟……但它似乎确实大部分有效。
class A extends Actor { ... }
class B extends Actor { ... }
class C(p: TestProbe) extends B {
override def receive = {
LoggingReceive {
case x =>
println(x.toString)
p.ref ! x
}
}
}
case class MsgToB(...)
// Spec class which extends TestKit
"A" should {
"send the right message to B" {
val p = TestProbe()
val a = TestActorRef[A]
val c = TestActorRef(Props(new C(p)))
// Assume A has a reference to C. Not shown here.
a ! msg
// Assert messages
p.expectMsgType[MsgToB]
}
}
这是最好的方法吗?有更好的做法吗?
最佳答案
对我来说,听起来你想要的是单独测试 Actor A 的行为。为了做到这一点,您需要能够控制 actor A 如何获取对 actor B 的引用。例如,您可以在 actor 的构造函数中提供引用:
import akka.actor.{Actor, ActorRef, Props}
class A(refToB: ActorRef) extends Actor { ... }
object A {
def props(refToB: ActorRef): Props = Props(new A(refToB))
}
还有其他方法可以将参与者 B 的引用传递给参与者 A,但使用构造函数可以说是最简单的选择。在上面的示例中,我们还提供了一种为 Actor 创建正确的 Props
的方法。
现在您可以控制对 actor B 的引用,您可以在测试中用测试探针替换 actor 引用。
import akka.testkit.TestProbe
// Initialise a test probe
val probe = TestProbe()
// Actor A with reference to actor B replaced with the test probe
val a = system.actorOf(A.props(probe.ref))
// Send a message to actor A
a ! someMessage
// Verify that the probe received a correct response from actor A
p.expectMsgType[MsgToB]
请注意,我使用 TestKit 中的 actor 系统而不是使用 TestActorRef
创建了 actor。这意味着 Actor 消息处理将是异步的而不是同步的。就我个人而言,我发现异步测试风格更适合,因为它更好地代表了 Actor 在生产系统中的运行方式。 Asynchronous testing is also recommended in the official documentation .
关于Scala 和 Akka - 使用 Akka Testkit 将 actor 作为系统进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36633566/
我正在尝试记录TestKit TestProbe收到的所有消息,事实证明这有些困难。我知道文档中的Actor Logging部分,其中说应该将debug.receive选项与LogginReceive
我在同一个类中有一系列测试都测试相同的功能,我如何跳过/忽略单个测试,例如: class FooTest(_system: ActorSystem) extends TestKit(_system)
我正在使用 Akka testkit 库来测试我的几个 Actor 。 这是我的 build.sbt 中的内容: "com.typesafe.akka" %% "akka-testkit" % "2.
为 TestProbe.expectNoMsg() 设置默认超时的正确方法是什么?在代码中不在配置中? 我知道我可以定义 akka.test.single-expect-default在 applic
我从 http://doc.akka.io/docs/akka/snapshot/scala/testing.html#Using_Multiple_Probe_Actors 扩展了示例. impor
我正在尝试将Gradle TestKit与JaCoCo集成。我正在使用这个插件 https://github.com/koral--/jacoco-gradle-testkit-plugin 这会创建
我正在尝试使用 Akka 的 TestKit 制作 specs2 测试。我被一个持续的编译错误困住了,我不知道如何解决,我很感激建议。 编译错误是: TaskSpec.scala:40: parent
我一直在尝试在我的 scalaTest 中这样记录事情: class ChangeSetActorTest extends PersistenceSpec(ActorSystem("Persisten
根据docs ,在(预期日志消息)下, Be sure to exchange the default logger with the TestEventListener in your applic
在这个例子中: http://doc.akka.io/docs/akka/snapshot/java/testing.html final Props props = Props.create(MyA
我正在使用 TestKit 测试我正在从事的涉及 Akka Actors 的 Scala 项目的一些类,我遇到了这个问题: 一个或多个请求的类不是套件:poc.PocConstituentsWatch
我对一个 actor 进行了测试,该 actor 可能会响应一些意外消息,但最终它必须响应特定的已知消息。所以本质上我想要一个断言,它会在某个时间跨度内忽略其他消息,但期待一个已知消息,就像这样:
我正在尝试测试我的 Akka.NET actors,但在使用 TestKit 和理解它的工作原理时遇到了一些问题。 由于 Akka.NET 中还没有关于单元测试的官方文档,我已经探索了 Akka.NE
我有一个 Akka Actor,它使用 Ask 模式从子 Actor 检索 Future 并对成功和失败采取行动。我不知道如何模拟 child Actor 并以失败作为回应。 这是代码: import
鉴于我有一个注入(inject)了 child actor 的 Supervisor actor,我该如何向 child 发送 PoisonPill 消息并使用 TestKit 对其进行测试? 这是我
自从将 Gradle 升级到版本 6 后,我注意到与我使用 TestKit 实现的功能测试相关的新警告。我很清楚如何摆脱它们。不清楚的是它们为什么首先出现,以及它们在功能测试的上下文中有何相关性。 这
Java 8 和 Akka (Java API) 2.12:2.5.16 在这里。我收到以下消息: public class SomeMessage { private int another
对akka Actor 来说有点新意 但希望了解 TestKit 、 TastActorRef 和 TestProbe 之间的用途和区别 在akka单元测试中使用。 我已经看到它们用于单元测试 akk
在我的 Scala 应用程序中,假设我有 Actor A 和 Actor B。我想在 ScalaTest 中设计一个测试用例,它允许我向 Actor A 发送消息,并查看它向 Actor B 发送什么
我正在对使用集群工具的参与者进行单元测试 DistributedPubSub .对于测试,我使用 Akka.net 的 TestKit。 显然,在 TestKit 中,系统参与者 Sys没有 Dist
我是一名优秀的程序员,十分优秀!