Unity3D进行单元测试时,测试类看不到被测类

时间:2019-05-03 14:22:17

标签: c# unity3d nunit

我想稍后用C#编写需要在Unity3D内部运行的脚本的单元测试。我的C#脚本位于Unity项目的“资产/脚本”文件夹中。

我在 Mac OS X 10.14.4版下将 Unity版本2019.1.0f2 Visual Studio Community for Mac V8.0.5(build 9)一起使用

Unity有一个我使用过的测试运行器窗口:Window > General > Test runner。在该测试运行器窗口中,我单击了“播放模式”和“创建播放模式测试程序集文件夹”。 Unity为我创建了一个名为“ Tests”的文件夹,应该在其中放置测试。到目前为止,一切都很好。

现在这是问题所在:

我的测试代码无法看到该测试文件夹的父文件夹中的被测类!

这是文件夹层次结构:

  Assets
    Scripts
      MyFirstScript.cs
      Tests
        MyTestScript.cs
        Tests.asmdef

当我双击MyTestScript.cs时,Visual Studio将打开解决方案,并且源文件将确定。现在,我正在尝试写

    var x = new MyFirstScript();

并且编译器抱怨“找不到类型或名称空间名称'MyFirstScript'”。

似乎“脚本”文件夹中的类在“测试”文件夹中的类内部是完全未知的。

这是MyFirstScript.cs:

using UnityEngine;

public class MyFirstScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

这是MyTestScript.cs:

using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

namespace Tests
{
    public class MyTestScript
    {
        // A Test behaves as an ordinary method
        [Test]
        public void MyTestScriptSimplePasses()
        {
            var x = new MyFirstScript(); // problem occurs HERE!

            // Use the Assert class to test conditions
        }

        // A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use
        // `yield return null;` to skip a frame.
        [UnityTest]
        public IEnumerator MyTestScriptWithEnumeratorPasses()
        {
            // Use the Assert class to test conditions.
            // Use yield to skip a frame.
            yield return null;
        }
    }
}

我希望我可以在测试代码(MyTestScript)中使用类MyFirstScript。我该怎么办?

1 个答案:

答案 0 :(得分:1)

查看this manual page的MonoBehaviourTest部分。

请注意,对于Unity,在MonoBehaviour派生的对象上调用“ new”几乎从来不是一个好主意。您几乎总是想通过在GameObject上调用AddComponent()来实例化它。