Zenject Unity3D тестирование сцены хит "не удается разрешить класс", как избавиться от? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть SceneA (A) и SceneB (B). В B также установлены Foo AsSingle и NonLazy, установленные установщиком SceneContext. В Foo реализована функция IInitialize для Debog.Log («Здравствуйте, ошибки!»):

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>();

И я говорю "Невозможно разрешить класс", в то время как в отладке я вижу приветственное сообщение Foo, поэтому установщик выполнил свою работу. Теперь, если Foo является MonoBehaviour, для игрового объекта с Zeneject, связывающим его как компонент «со сцены», то без проблем он будет решен. Пожалуйста, дайте мне знать, как решить, в этом случае.

** - Изменить - 1 **

Foo переименован в "BClass". Установщик А пуст. Код Б:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...