MessagePipe を Unity Test で使用してみる

github.com

自分で作成した似たようなイベント発行クラス

github.com

を使っていましたが、あのCyshapが作成したライブラリ。

使わない選択肢がない ということで使ってみました。


まずは触りだけ

Unityで使用する上で

まずはパッケージをインストールします。

通常のパッケージとあわせて VContainer, Zenject を選ぶ選択肢があります。

MessagePipeはDIContainerと連携しているということで、自分のプロジェクトがVContainerかZenjectどちらを使用しているかによって追加でパッケージをインストール。

(UniTaskも必須


最少実行

using NUnit.Framework;
using Zenject;
using Assert = UnityEngine.Assertions.Assert;
using MessagePipe;
using UnityEngine;

namespace 
{
    public class SimpleTest
    {
        // メッセーシを送る側
        public class MessageService
        {
            // Zenjectによって自動的にInject
            [Inject] private IPublisher<string> _pubLisher;

            public void Send(string message)
            {
                _pubLisher.Publish(message);
            }
        }

        // メッセージを受け取る側
        public class MessageHub : System.IDisposable
        {
            // Zenjectによって自動的にInject
            [Inject] private ISubscriber<string> _subscriber;
            
            private System.IDisposable disposable;

            public void Setup()
            {
                var bag = DisposableBag.CreateBuilder();
                
                _subscriber.Subscribe(x => Debug.Log(x)).AddTo(bag);
                
                disposable = bag.Build();
            }

            void System.IDisposable.Dispose()
            {
                disposable.Dispose();
            }
        }

        private DiContainer _contaier;

        [SetUp]
        public void Setup()
        {
            _contaier = new DiContainer();
        }

        // メッセージを送れるかテスト
        [Test]
        public void Test1()
        {
            InstallBindings(_contaier);
            
            var hub = _contaier.Instantiate<MessageHub>();
            hub.Setup();
            
            var service = _contaier.Instantiate<MessageService>();
            
            // Testという文字列をを送る
            service.Send("Test");
        }

        private void InstallBindings(DiContainer builder)
        {
            var options = builder.BindMessagePipe();

            // 使用するためにはDiContainerにバインドをしなければならない
            builder.BindMessageBroker<string>(options);
        }
    }
}

他のMessagePipeの記事を挙げられている方を参考に。

一旦このテストコードでメッセージを送られることを確認しました

f:id:toshizabeth:20210626182307p:plain


処理順序は

  1. builder.BindMessageBroker<string>(options); で string型のメッセージを送信/受信できるようにする
  2. MessageHub, MessageService を Zenjectから生成しBindしてもらう。
  3. あとは文字列を送ると MessageHub の _subscriber.Subscribe(x => Debug.Log(x)).AddTo(bag); Subscribeで受け取る


一旦最少コードは理解できたので次は上記コードの謎を少しずつ解消していこうと思います!