Unity中的单元测试和协同程序

时间:2014-07-07 04:36:29

标签: c# unit-testing reflection unity3d coroutine

所以我最近需要实现一些顺序代码执行并且使用单位Coroutines似乎已经谈了很多才能实现这个效果,并且它确实做到了。然而,它打破了我对逻辑的所有单元测试。所以为了解决这个问题,我从StartCoroutine调用它的函数中取出了逻辑,然后使用反射来调用方法,它似乎就是这样做的。这是代码

    [Test]
    public void Teleport_ToEmptyOpenGrid( )
    {
        WCBattleCard bCard  = iMB.InstantiateObject<WCBattleCard>();
        GridSpace gSpaceOne = iMB.InstantiateObject<GridSpace>();
        GridSpace gSpaceTwo = iMB.InstantiateObject<GridSpace>();

        TestUtility.MockGridSpace(gSpaceOne);
        TestUtility.MockGridSpace(gSpaceTwo);

        gSpaceOne.rightSpace = gSpaceTwo;
        gSpaceTwo.leftSpace = gSpaceOne;

        bCard.ability = new WCUnstableTeleport(bCard,null);

        gSpaceOne.gridExtension.CardDroppedIntoGrid(bCard);

        Assert.IsNotNull(bCard.transform.parent);
        Assert.AreNotEqual(bCard.transform.parent.gameObject, gSpaceTwo.gridExtension.transform.gameObject);

        IOnTurnStart ability = bCard.ability as IOnTurnStart;

        Assert.IsNotNull(ability);

        TestUtility.ReflectMethod<WCUnstableTeleport> ("Teleport", null, (WCUnstableTeleport)bCard.ability, BindingFlags.NonPublic | BindingFlags.Instance);

        Assert.AreNotEqual(bCard.transform.parent.gameObject, gSpaceOne.gridExtension.transform.gameObject);

        TestUtility.ReflectMethod<WCUnstableTeleport> ("Teleport", null, (WCUnstableTeleport)bCard.ability, BindingFlags.NonPublic | BindingFlags.Instance);

        Assert.AreNotEqual(bCard.transform.parent.gameObject, gSpaceTwo.gridExtension.transform.gameObject);
    }

应该如何调用StartCoroutine(ability.AbilityOnStart());,因为所有的能力都实现了这个界面,但是单元测试似乎并不同意,因此为什么我采用反射,我也不希望将逻辑公开为公共

所以我的问题是

  1. 这是一种可以接受的测试方法吗?
  2. 如果不是,那会是什么?
  3. 作为一个附带问题除了协同程序之外,是否还有一种替代顺序操作可以使测试更容易?

0 个答案:

没有答案