0

考虑以下演员:

class Stateful(worker: ActorRef) extends Actor {
   val queue = // immutable queue with details
   def receive = {
      case NewJob(details) => worker ! details
      case JobRejection(details) if sender == worker => // enqueue
      case JobRequest if sender == worker => // dequeue and send to worker
   }
}

这个简单的actor将所有工作转发给它的底层worker。如果工人太忙,他会拒绝这份工作,并且该工作会被排入队列以备后用。在某个时候,工作人员完成并从队列中请求另一个作业,依此类推。

为了测试这个演员,我传递了一个拒绝第一份工作的假工人,所以我可以测试它是否真的在队列中(有一个GetJobs消息,队列是不可变的,所以不用担心)。工作被拒绝后,我scheduleOnce用.JobRequestdelay100 millis

现在我从我的测试套件发送作业,使用该scheduleOnce技术稍等片刻,然后发送 GetJobs 消息。如果我很幸运,这份工作正在排队。我重复该过程,这次队列应该再次为空。有时确实如此。

有没有更好的方法来控制时间?因为基本上有三个延迟,我必须手动调整。并且在添加了另外几个这样的测试之后,不能保证这种调整可以在不同的机器上运行,甚至在我的机器上运行。

4

1 回答 1

1

不要使用假工人,而是使用TestProbe。然后,您可以在探针上使用标准的 TestKit 方法,并让探针将消息发送回参与者Stateful

请参阅参考手册中有关使用探针的部分。

于 2013-04-01T22:02:17.393 回答