2015-07-21 20 views
1

讓說我有一個名爲TestedActor至極的演員就是能救一個int值並將其發回如下測試演員值:如何與一家工廠接收

class TestedActor extends Actor { 
    override def receive = receive(0) 

    def receive(number: Int): Receive = { 
    case new_number: Int => context.become(receive(new_number)) 
    case ("get", ref: ActorRef) => ref ! number 
    } 
} 

在我的測試,我想能夠得到這個Integer並且測試它。

所以我一直在想喜歡創造一些:

class ActorsSpecs extends FlatSpec with Matchers { 

    case class TestingPositive(testedActor: ActorRef) extends Actor { 
    override def receive = { 
     case number: Int => checkNumber(number) 
     case "get" => testedActor ! ("get", self) 
    } 

    def checkNumber(number: Int) = { 
     number should be > 0 
    } 
    } 

    implicit val system = ActorSystem("akka-stream") 
    implicit val flowMaterializer = ActorMaterializer() 

    val testedActor = system.actorOf(Props[TestedActor], name = "testedActor") 
    val testingActor = system.actorOf(Props(new TestingPositive(testedActor)), name = "testingActor") 

    testingActor ! "get" 
} 

這種方式,我能夠創建此TestingPositive演員,獲得在TestedActor數量和checkNumber測試。

這似乎運作良好,我的問題是:

當測試失敗,它提高在演員線程的異常,我可以看到什麼地方出了錯在控制檯中,但它仍然是說所有我的測試成功了。因爲(我認爲)主線程不知道這個失敗。

有人知道比所有這個TestingActor的東西更簡單的方法嗎?

或者任何解決方案告訴主線程它失敗了?

謝謝

回答

3

看看使用TestKitdocs here。你可以爲你的演員寫一個更簡單的測試。你看怎麼樣這個測試:

import akka.actor.{Props, ActorSystem} 
import akka.testkit.{TestProbe, TestKit} 

import org.scalatest.{BeforeAndAfterAll, FlatSpecLike, ShouldMatchers} 

class ActorSpecs extends TestKit(ActorSystem("TestSystem")) 
    with FlatSpecLike 
    with ShouldMatchers 
    with BeforeAndAfterAll { 

    override def afterAll = { 
    TestKit.shutdownActorSystem(system) 
    } 

    def fixtures = new { 
    val caller = TestProbe() 
    val actorUnderTest = system.actorOf(Props[TestedActor], name = "testedActor") 
    } 

    "The TestedActor" should "pass a good test" in { 
    val f = fixtures; import f._ 

    caller.send(actorUnderTest, 42) 
    caller.send(actorUnderTest, ("get", caller.ref)) 
    caller.expectMsg(42) 
    } 

    "The TestedActor" should "fail a bad test" in { 
    val f = fixtures; import f._ 

    caller.send(actorUnderTest, 42) 
    caller.send(actorUnderTest, ("get", caller.ref)) 
    caller.expectMsg("this won't work") 
    } 
} 

此外,你應該知道sender。當你的get肯定的作品,更清潔的方法可能是回覆發送演員:

def receive(number: Int): Receive = { 
    case new_number: Int => context.become(receive(new_number)) 
    case "get" => sender ! number 
} 

而且測試變爲:

"The TestedActor" should "pass a good test" in { 
    val f = fixtures; import f._ 

    caller.send(actorUnderTest, 42) 
    caller.send(actorUnderTest, "get") 
    caller.expectMsg(42) 
} 

最後,我會無恥地堵塞my recent blog post約維持阿卡代碼庫與我的團隊。我覺得道義上有義務給新的讀者一個閱讀它的機會。 :)

+0

謝謝你它運作良好!我不知道「發件人」的東西!我會讀你的博客;) – Charrette