Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Zenject.SceneTestFixture and DI
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yosuke Nakano
October 23, 2019
Technology
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Zenject.SceneTestFixture and DI
How to use Zenject.SceneTestFixture and example clean architecture on unity.
Yosuke Nakano
October 23, 2019
More Decks by Yosuke Nakano
See All by Yosuke Nakano
M5StickCでのIMU開発
naninunenoy
2
2.3k
最近行った焼肉屋
naninunenoy
0
510
M5Stack with Unity
naninunenoy
3
2.9k
M5Stack x IMU x BLE
naninunenoy
1
880
Other Decks in Technology
See All in Technology
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
1.6k
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
430
認知負荷をGemini で溶かす — GKE 基盤「Orbit」における AI エージェントの実践
sansantech
PRO
1
270
OSPN.JPバージョンアップ作業進捗のご報告 / 20260801-osc26kyoto
akkiesoft
0
420
攻撃と防御で学ぶAI時代のプロダクトセキュリティ演習
recruitengineers
PRO
7
2.2k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
MIRU 2026 チュートリアル
keisuke198619
0
860
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
1
970
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
1
360
関東Kaggler会発表資料
takoi
1
190
20分でわかるセキュアAPI
nwiizo
1
190
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
12
8.4k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
410
エンジニアに許された特別な時間の終わり
watany
108
250k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
790
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
GraphQLとの向き合い方2022年版
quramy
50
15k
New Earth Scene 8
popppiees
3
2.5k
Test your architecture with Archunit
thirion
1
2.3k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
200
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
890
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
中野 洋輔 Moff Inc. Zenject.SceneTestFixture と向き合った naninuneno_y
Zenject.SceneTestFixture • Dependency Injection(依存性注入)のためのライブラリ • 過去の勉強会でも取り上げられている • Unity Zenject完全に理解した 依存性注入?
疎結合というキーワードが出始めた時、C#ならばinterfaceを使うのが常套手段 InterfaceBに依存したClassAにClassBのインスタンスを渡してやるのが依存性注入
Zenject.SceneTestFixture • ZenjectではTest-Runnerでの実行もサポートされており、 • テストコード上で専用のBind()を行うことができる • その内、シーンテストを行うためのもの Zenject/WritingAutomatedTests.md 詳しくは 自分でGoogle翻訳かけた版
そもそも何がしたいんだっけ? • 画面毎(≒シーン毎)の挙動をテストしたい • このボタンを押すとxxxが消えるとか • 名前の入力とか • アプリケーションロジックをテストしたい •
ログイン画面のテストでサーバにアクセスしない • ゲームコントローラが無くてもテストできる
そもそもinterfaceって? • オブジェクト指向をより理解するために実際に書いて解説する (Qiita) • クラスの継承がコーディングの上で何が便利か • Interfaceの抽象化のメリット/デメリット • Unity開発で使える設計の話+Zenjectの紹介(SlideShare)
• SOLID原則について説明 • Zenjectの導入もある • 書籍 • Adaptive Code ~ C#実践開発手法 第2版 (マイクロソフト関連書) • Clean Architecture 達人に学ぶソフトウェアの構造と設計
Clean Architecture • 手掛かり無く抽象化を行うよりは、 アーキテクチャに則るのが良い • アプリケーションのロジックを UseCasesより内側に閉じ込める • テストに場合に青の層の実装を入れ替
える CleanArchitectureでひとつ 『上』 のコードを目指す:概念編(Qiita)
LoginUseCase LoginPresenter LoginView ILoginPresenter ILoginView AuthController FirebaseAuth IAuthController DummyAuth IAuth
ログイン画面を作る場合… • 普通に使うときはFirebaseAuthを使い、テストで実 行する場合はDummyAuthを使うよう切り替えたい • 依存先をinterfaceにしているので、DI次第で可能!
シーン上では… public class LoginMain : MonoBehaviour { IUseCase authUseCase; [Inject]
void ConstructUseCases(IAuthController authController, ILoginPresenter loginPresenter) { authUseCase = new AuthUseCase( loginPresenter, authController, this ); } void Awake() { authUseCase.Begin(); } } • InjectメソッドでUseCaseの材料を受け取り、 UseCaseを生成 • MonoBehaviour.Awakeで実行 CleanArchitectureでひとつ 『上』 のコードを目指す:実装編(Qiita)
シーン上では… public class LoginSceneInstaller : MonoInstaller { [SerializeField] LoginView loginView
= default; public override void InstallBindings() { Container .Bind<IAuthController>() .FromInstance(new AuthController(FirebaseAuth.DefaultInstance)) .AsCached(); Container .Bind<ILoginPresenter>() .FromInstance(new LoginPresenter(loginView)) .AsCached(); } } • [SerializeField]など実装の詳細はDIを行うこいつ集約
public class LoginSceneTest : SceneTestFixture { LoginPresenter loginPresenter = new
LoginPresenter(); AlertView alertView; LoginView loginView; AuthController auth = new AuthController(new DummyAuth()); [UnityTest] public IEnumerator ログイン失敗でアラートが表示されるか() { // StaticContextにBind StaticContext.Container.Bind<ILoginPresenter>().FromInstance(loginPresenter).AsTransient(); StaticContext.Container.Bind<IAuthController>().FromInstance(auth).AsTransient(); // シーン読み込み yield return LoadScene("Login"); // シーンから欲しい要素をfind var canvas = GameObject.Find("Canvas").transform; alertView = canvas.Find("AlertView").GetComponent<AlertView>(); loginView = canvas.Find("LoginView").GetComponent<LoginView>(); loginPresenter.View = loginView; // 適当なID/パスワード入力 loginView.IdInputField.onEndEdit.Invoke("hoge"); loginView.PasswordInputField.onEndEdit.Invoke("fuga"); // 実行 loginView.LoginButton.onClick.Invoke(); yield return null; // アラートが表示されているか Assert.IsTrue(alertView.gameObject.activeSelf); // 閉じるボタン alertView.CloseButton.onClick.Invoke(); yield return null; // アラートが消えたか Assert.IsFalse(alertView.gameObject.activeSelf); } } • なんかいけそうやん!
• StaticContextよりもSceneContextが優先されることを知り、 InstallerのBindすべてに.IfNotBound()をつけた • LoadScene時にAwakeが実行されないようにMainをアタッチ したGameObjectをテストのときには一時非アクティブにする ようにした • GitHub •
労力とリターンがあってない気がする(他にいい方法あるだろ) しかしこの後… naninunenoy/UnityViewPatterns/ViewPattern/BMIApp