所以我最近需要实现一些顺序代码执行并且使用单位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());
,因为所有的能力都实现了这个界面,但是单元测试似乎并不同意,因此为什么我采用反射,我也不希望将逻辑公开为公共
所以我的问题是
作为一个附带问题除了协同程序之外,是否还有一种替代顺序操作可以使测试更容易?