问题标签 [akka-testkit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
498 浏览

scala - Akka Actor isTerminated 已弃用

只需编写一个单元测试以确保演员在某些条件下关闭,所以我有一个类似的测试:

我收到一个警告,isTerminated已被弃用。提示建议我使用context.watch()但是在单元测试中我没有父演员或任何要观看的上下文。

验证tddTestActor关闭的最佳方法是什么?

0 投票
0 回答
156 浏览

scala - 在除最后一个测试用例之外的存根中使用状态变量时,Akka Testkit 不起作用

将以下存根与 Akka Testkit 一起使用时出现问题:

当我运行以下测试用例时:

不幸的是,这不起作用。我们得到一个超时:

错误 oacprocessor.DefaultErrorHandler - (MessageId:
xxx on ExchangeId: xxx) 的传递失败。交付尝试后用尽:1 捕获:
java.util.concurrent.TimeoutException:无法
在超时 [1 秒] 内从参与者 [ActorEndpointPath(akka://xxx/stubActor] 获得响应。

当将更改doNotRespond状态变量的测试用例作为最后一个测试用例时,一切正常。

为什么会这样,如何解决?

0 投票
1 回答
388 浏览

scala - Spray、Akka、Scala 方法来测试完整的 Actor 系统

我有一个使用 Spray、Akka 和 Scala 的应用程序。当前的单元测试是通过 Scala Test 完成的。该应用程序使用 Spray 路由来确定和解析有关 Web 请求的一些基本数据,然后将其传递给参与者以执行所需的操作。对于 Spray,我们使用一个自定义的初始化类,它继承自 spray.servlet.Initializer,它配置和启动每个参与者。这些操作的一部分是调用大约 7 或 8 个其他 Web 服务。每个都有一个参与者来处理与各自服务的通信。因此,我们在主要参与者中执行了一堆逻辑,将通信委托给其他参与者,最后除了它自己的工作之外,它还处理所有返回的数据。

我想使用 Scala Test 和 Akka Testkit 来测试整个系统,使用 Testkit 来替换通信参与者以返回合适的测试数据。

问题分为两部分。

  • 什么是更好的测试方法?我可以使用 Scala Testkit 通过 Spray Testkit 通过 Spray 路由服务发出请求。另一种方法是,由于主要参与者通过案例类获取路由服务结果,因此直接将消息传递给跳过路由服务的参与者。两者都有其优点。但是,我确实发现 Spray testkit 上的文档很少。当 spray.servlet.Initializer 中的参与者有初始化逻辑时,如何通过 Akka Testkit 替换参与者?

  • 第二个是如何通过 Akka Testkit 建立一个更复杂的 Actor 系统。文档提到这是可能的,但远未说明如何做到这一点。我有路由服务,它是一个参与者,它与作为业务逻辑主体的另一个参与者对话,然后与其他几个参与者对话。参考 Akka Testkit 文档,这些通信参与者是否被视为“儿童”参与者?是否有一个项目可以展示作为一个整体测试丰富的 Akka Actor 系统的最佳实践?

在这种情况下,我的直觉是拥有一组基于 Spray Testkit 的测试来测试我们的路由系统。然后,进行一组测试,将我们的数据案例类发送给主actor,并在其后面带有模拟的通信actor,并验证我们从主actor那里得到正确的响应。

0 投票
1 回答
145 浏览

scala - 测试一个 akka actor 在不保证顺序的情况下接收到一组不同类型的消息

TL;博士:

我不知道如何在不保证消息顺序的情况下测试 Akka actor 是否接收到一组不同类型的消息。

规格:

我正在测试一些域事件是否发布到akka.event.EventStream. 为此,我订阅了TestProbe所有DomainEvent子类:

这样,我可以测试单个域事件是否到达,EventStream而不考虑其他可能的事件(避免脆弱的测试):

规格:

帮手特质:

我还对我应该接收一组相同类型的事件的场景进行了一些测试,以保证顺序而不考虑其他可能的事件(避免脆弱的测试):

规格:

帮手特质:

现在的问题在于我必须测试我正在发布一组具有不同类型且没有保证顺序的事件的用例

我不知道如何解决的问题是,在这种shouldPublishDomainEventsOfType情况下,我有一个推断EventType,它为我提供了类型,以便在eventAsserter: EventType => Unit. 但是由于我有不同的特定类型的事件,我不知道如何指定它们的类型等等。

我尝试了一种基于包含断言函数的案例类的方法,但问题是一样的,我有点卡住了:

谢谢!

0 投票
1 回答
842 浏览

scala - Scala and Akka - 使用 Akka Testkit 将参与者作为系统进行测试

在我的 Scala 应用程序中说我有 ActorA和 Actor B。我想在 ScalaTest 中设计一个测试用例,允许我向 Actor 发送消息A并查看它发送给 ActorB的消息,以便查看是否A正确处理它的数据并将正确的消息发送到B. 如何测试这个?我花了很长时间才自己完成这个……但它似乎确实有效。

这是最好的方法吗?有更好的做法吗?

0 投票
1 回答
43 浏览

akka - 在akka testkit中,为什么使用事件而不是普通方法来获取actor状态?

在演员第三章的阿卡书中。它使用消息事件来测试静默演员的状态。

演员是这样的:

测试代码如下:

内部测试代码为什么使用 GetState 获取上述SilentMessage事件的结果。
为什么不slientActor.internalState直接使用得到结果呢?

更新

有些朋友似乎误导了我的问题。详细的,书上说

使用internalState变量会遇到并发问题,所以应该使用GetState事件告诉actor获取actor的内部状态而不是internalState直接使用。

不知道为什么会遇到并发问题,为什么使用GetState可以解决问题

解释

slientActor.internalState无法直接获取内部变量,请理解,使用silentActor.underlyingActor.internalState可以得到它。非常抱歉这个可怕的问题。

0 投票
1 回答
663 浏览

scala - 在 Akka 中嘲笑儿童演员

我正在尝试为我的演员编写单元测试并坚持基本的模拟。PriceAggregateActor 正在使用 akka 持久性,我不想为它传递所有的 conf 并且想完全模拟它。

这是我要测试的演员

所以在我的测试中,我试图做类似的事情:

我总是得到:

为什么抱怨 mockedChild?它不应该采用任何构造函数参数。

0 投票
1 回答
45 浏览

scala - 如何在失败的情况下正确测试参与者的行为

了解系统在特定参与者失败时的行为非常重要 - 恢复如何运行,是否正确获取快照等。令人惊讶的是,我在文档中没有找到任何建议

我在一些例子中看到的一种方法是有一个特殊的Failmsg 并让演员Exception在这个 msg 上抛出一个。

我希望永远不要使用它,因为它混合了生产代码和测试代码,并且可能会在毫无戒心的读者中产生一些合理的 WTF。

我将如何诱导任意演员正确失败?

谢谢

0 投票
1 回答
3129 浏览

scala - Akka Actor 测试:使用 TestProbe 自动回复

我试图让测试探针在收到任何消息时回复确认。

我在测试中编写了以下代码,但它不起作用:

有没有办法做到这一点。实际将消息发送到测试探针的参与者肯定是在除 TestThread 之外的另一个线程上运行。您可以在下面看到当前制作的完整测试。

}

changeSetActor 已经过全面测试并且可以正常工作。测试与 ChangeWriter 挂起。它永远不会在接收方法中收到消息。

EDIT1(跟随@Jakko anser)

自动驾驶仪如下:

尽管到目前为止给出的所有解释都很清楚,但官方示例中令人困惑的是参考“testActor”。这里的 testActor 是谁?那时没有该名称的变量声明。

0 投票
0 回答
215 浏览

dependency-injection - Akka.net 中正确的 TDD + 依赖注入

我有代理,它将读取目录 X 并为它找到的每个子目录创建子代理。

对于我的测试环境,我使用了 System.IO.Abstractions 包,它创建了 IFileSystem 接口及其实现(供正常程序使用)。

代理(用于 dir X)使用 Autofac DI 创建子代理(因为我们需要为它们提供 IFileSystem 依赖,未来可能还会更多):

我的测试如下所示:

现在的问题是:我如何告诉 TestKit 实际使用我的容器进行依赖注入