代码之家  ›  专栏  ›  技术社区  ›  Ariam1

Zenject Unity3D测试场景点击“无法解析类”如何摆脱?

  •  1
  • Ariam1  · 技术社区  · 7 年前

    我有SceneA(A)和SceneB(B)。B还有一个fooassingle和NonLazy,由SceneContext安装程序安装。Foo实现了一个IInitialize删除日志(“你好错误!”):

    yield return LoadScene("SceneA");
    yield return new WaitForSeconds(2.0f);
    SceneManager.LoadScene("SceneB");
    yield return new WaitForSeconds(2.0f);
    var newSceneContainer = ProjectContext.Instance.Container.Resolve<SceneContextRegistry>()
    .SceneContexts.Single().Container;
    Foo foo = newSceneContainer.Resolve<Foo>();
    



    **--编辑--1**

    A的安装程序为空。 B代码:

    public class BInstaller : MonoInstaller
    {
        public override void InstallBindings()
        {
            Container.BindInterfacesAndSelfTo<BClass>().AsSingle().NonLazy();
        }
    }
    
    public class BClass : IInitializable, IDisposable {
        public void Initialize() { Debug.Log("Hello Errors!"); }
        public void Dispose() { }
    }
    

    public class ScenesFlow_A_to_B : SceneTestFixture
    {
        [UnityTest]
        public IEnumerator TestScene()
        {
            yield return LoadScene("SceneA");
            //waiting
            SceneManager.LoadScene("SceneB");
            //waiting
            var newSceneContainer = ProjectContext.Instance.Container
            .Resolve<SceneContextRegistry>().SceneContexts.Single().Container;
            BClass bc = newSceneContainer.Resolve<BClass>() as BClass;
            Assert.IsNotNull(bc);// fail!
        }
    }
    

    --编辑2--

    新变化:

    public class ScenesFlow_A_to_B : SceneTestFixture
    {
        [UnityTest]
        public IEnumerator TestScene()
        {
            yield return LoadScene("SceneA");
            //SceneManager.LoadScene("SceneB");
            yield return SceneManager.LoadSceneAsync("SceneB");
            var newSceneContainer = ProjectContext.Instance.Container
            .Resolve<SceneContextRegistry>().SceneContexts.Single().Container;
            BClass bc = newSceneContainer.Resolve<BClass>() as BClass;
            Assert.IsNotNull(bc);
        }
    }
    

    结果是:

    TestScene (0.323s)
    ---
    System.InvalidOperationException : Operation is not valid due to the current state of the object
    ---
    at System.Linq.Enumerable.Single[SceneContext] (IEnumerable`1 source) [0x00000] in <filename unknown>:0 
    at ScenesFlow_A_to_B+<TestScene>c__Iterator0.MoveNext () [0x00089] in ...  at UnityEngine.TestTools.TestEnumerator+<Execute>c__Iterator0.MoveNext () [0x00031] in .../TestEnumerator.cs:29
    ---
    Loading scene 'SceneA' for testing
    I am class B
    
    0 回复  |  直到 7 年前