public override IEnumerator RunTest() { var testTracker = new TestAppFlowTracker(); AppFlow.instance = testTracker; AppFlow.instance.ActivateLinkMapTracking(); AppFlow.instance.ActivatePrefabLoadTracking(); AppFlow.instance.ActivateUiEventTracking(); AppFlow.instance.ActivateViewStackTracking(); setupImmutableDatastore(); // In setupImmutableDatastore() Log.MethodEntered is used, so there must be a recorded method: Assert.AreEqual(1, testTracker.recordedEvents.Count(x => x.category == EventConsts.catMethod)); // In setupImmutableDatastore() the datastore will be set as a singleton: Assert.AreEqual(1, testTracker.recordedEvents.Count(x => x.action.Contains("DataStore"))); var store = MyDataModel.GetStore(); Assert.NotNull(store); store.Dispatch(new ActionSetBool1() { newB = true }); store.Dispatch(new ActionSetString1 { newS = "abc" }); Assert.AreEqual(true, store.GetState().subSection1.bool1); Assert.AreEqual("abc", store.GetState().subSection1.string1); // After the 2 mutations, there should be 2 mutation AppFlow events recorded: Assert.AreEqual(2, testTracker.recordedEvents.Count(x => x.category == EventConsts.catMutation)); var presenter = new MyDataModelPresenter(); presenter.targetView = gameObject; yield return(presenter.LoadModelIntoView(store).AsCoroutine()); // After the presenter loaded the UI there should be a load start and load end event recorded: Assert.AreEqual(2, testTracker.recordedEvents.Count(x => x.category == EventConsts.catPresenter)); // The MyDataModelPresenter uses a GetLinkMap() when connecting to the view: Assert.AreEqual(1, testTracker.recordedEvents.Count(x => x.category == EventConsts.catLinked)); yield return(new WaitForSeconds(1)); }