簡體   English   中英

Akka.net和單元測試

[英]Akka.net and Unit tests

我想用Akka.net TestKit編寫單元測試,但我有一個問題。 我有一個類SubscriptionService,負責向選定的actor傳輸消息。

public class SubscriptionService : ReceiveActor
{
    private readonly ActorSelection service1;

    private readonly ActorSelection service2;

    public SubscriptionService()
    {
        this.service1 = Context.ActorSelection("Service1");
        this.service2 = Context.ActorSelection("Service2");

        this.Receive<RequestMessage>(message => this.ProcessRequestMessage(message));
    }

    private void ProcessRequestMessage(RequestMessage message)
    {
        this.service1.Tell(message);
        this.service2.Tell(message);
    }

我該如何測試這種行為? 我創建了這個測試但是在這個測試中我得到了異常。 附加信息:Assert.Fail失敗。失敗:等待消息時超時00:00:03

[TestClass]
public class SubscriptionServiceUnitTests : TestKit
{
    [TestMethod]
    public void Test1()
    {
        var subscriptionServiceRef = this.ActorOfAsTestActorRef<SubscriptionService>("SubscriptionService");

        subscriptionServiceRef.Tell(new RequestMessage());

        var answer = this.ExpectMsg<RequestMessage>();
    }

我的意思是如何在Test1方法中獲取service1和service2的消息?

ExpectMsg僅在與特殊類型的名為TestActor的actor結合使用TestActor 您可以從測試工具包訪問/創建它。 它的作用是捕獲並驗證發送給它的消息。

如果您稍微重新設計SubscriptionService actor,則可以將測試actor refs傳遞給它。 最簡單的方法是簡單地通過actor構造函數注入actor refs - 我使用了ICanTell接口,這是更通用的形式,由actor refs和actor選擇實現:

public class SubscriptionService : ReceiveActor
{
    private readonly ICanTell service1;
    private readonly ICanTell service2;

    public SubscriptionService(ICanTell service1, ICanTell service2)
    {
        this.service1 = service1;
        this.service2 = service2;
        this.Receive<RequestMessage>(message => this.ProcessRequestMessage(message));
    }

這樣你就可以使用以下方法創建你的演員

Context.ActorOf(Props.Create(() => new SubscriptionService(Context.ActorSelection("Service1"), Context.ActorSelection("Service2")));

要測試它,在TestKit規范類中使用TestActor或TestProbe初始化它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM