Search Unity

Question Testing and NetworkBehaviours

Discussion in 'Testing & Automation' started by Vexorum, Sep 16, 2018.

  1. Vexorum

    Vexorum

    Joined:
    Jan 9, 2016
    Posts:
    8
    Hi!

    I've been trying all day to set up some automated tests with the Unity Test Runner for some various units in my game. Here's an example of what I have.

    Code (CSharp):
    1.  [UnityTest]
    2.         public IEnumerator MinerShouldMineMineral()
    3.         {
    4.             yield return new WaitForSeconds(3.1f);
    5.  
    6. // Needed for unit admin
    7.             _autoPlayerNodeGo = new GameObject();
    8.             _autoPlayerNodeGo.name = "AutoPlayerNode";
    9.  
    10.             yield return new WaitForSeconds(3.1f);
    11.  
    12. // A chunk of iron ore. Place it on the map.
    13.             var orePrefab = Resources.Load(@"Prefabs\Minerals\IronOre");
    14.             var ore = Instantiate(orePrefab, EndPosition, Quaternion.identity) as GameObject;
    15.  
    16.             yield return new WaitForSeconds(3.1f);
    17.  
    18. // A resource mining unit. Place it on the map.
    19.             var prefab = Resources.Load(@"Prefabs\Units\Miner");
    20.             _miner = Instantiate(prefab, StartPosition, Quaternion.identity) as GameObject;
    21.             _miner.GetComponent<Unit>().PlayerInfo = autoplayerNode;
    22.  
    23.             yield return new WaitForSeconds(3.1f);
    24.  
    25. // Code omitted: Order the mining unit to pick up the iron ore.
    26.  
    27.             yield return new WaitForSeconds(20.0f);
    28.  
    29. // Assert, the miner has picked up the ore.
    30.             var inventory = _miner.GetComponent<IInventoryBlock>();
    31.             Assert.That(inventory.GetUsedCapacity(), Is.EqualTo(1));
    32.         }
    I feel like I'm almost there. But here's the problem that has me blocked. The miner unit and the ore block use a few CMD methods with the [Command] attribute to sync with the server.

    Code (CSharp):
    1.  
    2.         [Command]
    3.         public void CmdSetBeingMined()
    4.         {
    5.             IsBeingMined = true;
    6.             _rb.isKinematic = true;
    7.             _rb.detectCollisions = false;
    8.         }
    9.  
    10.         [Command]
    11.         public void CmdClaimResource(string claimerId)
    12.         {
    13.             if (isServer)
    14.             {
    15.                 ClaimerId = claimerId;
    16.             }
    17.         }
    18.  
    This runs wonderfully when I play in the editor. Or when I build and run a client and join a few instances together. But in the Test Runner it fails and I get this:

    Command function CmdClaimResource called on server.


    I'm using the test runner in Play mode. Everything is behaving as expected. But I can't seem to get the Cmd methods to execute the same way they do when I run the game in the editor and play as host.

    It's beginning to feel like I'm fighting the framework. So I suspect I'm trying to build my tests wrong. Any insight on how to approach testing of network behaviours would be very much appreciated.
     
    Last edited: Sep 16, 2018