3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unityでfirestore emulatorを使ったunit testを作る

Last updated at Posted at 2022-04-22

こんにちは。virapture株式会社もぐめっとです。

mogmet.jpg
京都で花見をしてみたらとても満開でめちゃくちゃ満足度高かかったのでまた行きたいと思いました。

本日はUnityとFirestore Emulatorを使ったUnit testのやり方について解説いたします。

事前準備

firebaseコマンドでエミュレータを起動できるようにしておきます。

npm install -g firebase-tools
cd {firebase.jsonを定義してるところがあるのディレクトリ}

firebase.jsonがなければ下記コマンドでプロジェクトの設定をしましょう。

firebase init

emulatorを起動します。

firebase start emulator

これで準備おk!

前知識

emulatorを使うようにする

unityのfirestore emulatorの使用はマニュアルには書いてないのですが、実は下記コードを記載することで使えるようになります。

var firestore = FirebaseFirestore.DefaultInstance;
if (firestore.Settings.Host == "localhost:8080")
{
    return;
}
firestore.Settings.Host = "localhost:8080";
firestore.Settings.SslEnabled = false;

Hostの設定をチェックしていますが、既にインスタンスが設定されている時にHostを変更しようとするとエラーになってしまうため、チェックをしてから設定するようにしています。

テストデータの削除

テストデータを一斉削除するにはemulatorに用意されているAPIを叩くことで削除できます。

UnityWebRequest request = UnityWebRequest.Delete(
            "http://localhost:8080/emulator/v1/projects/{プロジェクト名}/databases/(default)/documents");
await request.SendWebRequest();

テストの前とかに毎回リセットなどを行うといいと思います。

このあたりはios/androidとかでも同様なことが言えます。

テストを書く

ではfirestoreの前知識がわかったところで早速Unit Testを書いてみましょう!
今回はZenjectも絡めたテストを紹介します。

public class ViewModelTest : ZenjectUnitTestFixture
{
    [Inject] private IViewModel target = default!;
    private FirebaseFirestore firestore = default!;

    [OneTimeSetUp]
    public void setupOnce()
    {
        firestore = FirebaseFirestore.DefaultInstance;
        if (firestore.Settings.Host == "localhost:8080")
        {
            return;
        }
        firestore.Settings.Host = "localhost:8080";
        firestore.Settings.SslEnabled = false;
    }

    [SetUp]
    public void CommonInstall()
    {
        // テスト対象のオブジェクトを注入
        Container.BindInterfacesTo<ViewModel>().AsCached();
        Container.Inject(this);
    }
    
    private async UniTask setupData()
    {
        // 一回テストデータを削除してから
        UnityWebRequest request = UnityWebRequest.Delete(
            "http://localhost:8080/emulator/v1/projects/{プロジェクト名}/databases/(default)/documents");
        await request.SendWebRequest();
        // テストデータを投入
        await firestore.Document("rooms/1").SetAsync(new Dictionary<string, object> {{"name", "部屋名"}});
    }

    [UnityTest]
    public IEnumerator TestRoom() => UniTask.ToCoroutine(async () =>
    {
        await setupData();
        var room = await target.FetchRoom();
        Assert.AreEqual(room.name, "部屋名");
    });
}

unityでのtestはSetupでasync awaitを使うことができないので、UnityTestでデータの設定などを行うようにしています。
本当はSetupでそういったデータの準備ができると一番いいんですが残念です。

まとめ

emulatorを使うことでunityでもfirestoreを絡めたテストを行うことができるようになりました。
Authenticationはまだemulatorには対応していないようなので、Moqなどを使ってmock化して処理すると良さげです。

最後に、ワンナイト人狼オンラインというゲームを作ってます!よかったら遊んでね!

他にもCameconOffchaといったサービスも作ってるのでよかったら使ってね!

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?