我有一个由玩家控制的softozor游戏对象组成的“主”场景。这是一只飞扬的恐龙。作为该softozor游戏对象的子代,我设置了另一个游戏对象Installer,它由一个Transform组件和一个PlayerInstaller (Script)组件组成:



PlayerInstaller安装播放机逻辑所需的所有内容。最后,在softozor游戏对象中,我添加了Game Object Context (Script)并注册了PlayerInstaller



除了softozor游戏对象之外,我还定义了一个SceneContext



您会注意到,所有安装程序列表在该SceneContext中都是空的。但是,如果该SceneContext不进行任何注册,则不会触发PlayerInstaller。使用该设置玩游戏效果很好,即调用PlayerInstaller,我可以控制恐龙做我想做的事情。

到目前为止,一切都很好。现在,考虑以下场景测试:

public class PlayerTests : SceneTestFixture
{
  [Inject]
  private IPlayer _player;

  [UnityTest]
  public IEnumerator TestScene()
  {
    yield return LoadScene("Main");

    _player.Flap();
    yield return new WaitForSeconds(0.01f);
    [...]
  }
}


在该测试中,不会向_player成员变量注入满足IPlayer约定的对象。实际上,不会调用PlayerInstaller.InstallBindings()

如果是I,则摆脱我的Game Object Context (Script)游戏对象中的softozor组件,并在PlayerInstaller中注册SceneContext



然后我也可以像以前一样玩游戏,并且我的测试正在运行,即在我的场景测试期间调用PlayerInstaller.InstallBindings()方法。

PlayerInstaller游戏对象上下文中注册softozor的第一次尝试有什么问题?

我正在与


Zenject版本7.3.1
Unity 2019.1.8f1 PC,Mac和Linux独立版

最佳答案

因此,您有两个容器,分别是SceneContextGameObjectContext

我认为这里发生的是它们都已安装,但是您的GameObjectContext并未添加到SceneContext中-在SceneContext实际需要了解GameObjectContext之前,它一直起作用(您的情况就是这样)现场测试)。

不知道什么是IPlayer以及您希望在那里注入什么,很难给出更精确的指示,但是有意义的是它不是注入到您的SceneContext中,而是注入到您的GameObjectContext中。

通过将PlayerInstaller放在SceneContext的MonoInstallers列表中,可以从技术上解决该问题,但这显然不是您想要的,因为它使子容器无用并破坏了您要进行的任何分离。

取而代之的是,您需要使用立面:Sub-containers and Facades: Using GameObjectContexts来连接这两个上下文(说明由一个示例组成,因此我引述其中的部分内容没有任何意义,但它详尽且有用)

关于unity3d - 在某些情况下,不会在场景测试中调用Zenject Mono Installer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57286720/

10-10 19:18