【问题标题】:Unity Test Tools Unit Test with GameObject gives "You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed." [duplicate]Unity 测试工具 Unity Test with GameObject 给出“您正在尝试使用 'new' 关键字创建 MonoBehaviour。这是不允许的。” [复制]
【发布时间】:2015-11-07 00:21:51
【问题描述】:

我正在使用 Unity 测试工具框架。我的单元测试代码看起来像这样(包括更多)

[TestFixture]
public class ActionMasterTester: MonoBehaviour{
    private ActionMaster actionMaster;

    [SetUp]
    public void SetUp()
    {
        actionMaster = new ActionMaster();
    }
}

ActionMaster 如下所示:

public class ActionMaster : MonoBehaviour {
}

如果我运行一个测试,那么我会在actionMaster = new ActionMaster(); 上收到以下警告

You are trying to create a MonoBehaviour using the 'new' keyword.  This is not allowed.  MonoBehaviours can only be added using AddComponent().  Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
ActionMaster:.ctor()
ActionMasterTester:SetUp() (at Assets/Editor/ActionMasterTester.cs:21)
System.Reflection.MethodBase:Invoke(Object, Object[])
NUnit.Core.Reflect:InvokeMethod(MethodInfo, Object, Object[])
NUnit.Core.Reflect:InvokeMethod(MethodInfo, Object)
NUnit.Core.TestMethod:RunSetUp()
NUnit.Core.TestMethod:RunTest()
NUnit.Core.NUnitTestMethod:RunTest()
NUnit.Core.TestMethod:RunRepeatedTest()
NUnit.Core.TestMethod:RunTestInContext()
NUnit.Core.TestMethod:Run(EventListener, ITestFilter)
NUnit.Core.TestSuite:RunAllTests(TestResult, EventListener, ITestFilter)
NUnit.Core.TestSuite:RunSuite(EventListener, ITestFilter)
NUnit.Core.TestSuite:RunSuiteInContext(EventListener, ITestFilter)
NUnit.Core.TestSuite:Run(EventListener, ITestFilter)
NUnit.Core.TestFixture:Run(EventListener, ITestFilter)
NUnit.Core.TestSuite:RunAllTests(TestResult, EventListener, ITestFilter)
NUnit.Core.TestSuite:RunSuite(EventListener, ITestFilter)
NUnit.Core.TestSuite:RunSuiteInContext(EventListener, ITestFilter)
NUnit.Core.TestSuite:Run(EventListener, ITestFilter)
NUnit.Core.TestSuite:RunAllTests(TestResult, EventListener, ITestFilter)
NUnit.Core.TestSuite:RunSuite(EventListener, ITestFilter)
NUnit.Core.TestSuite:RunSuiteInContext(EventListener, ITestFilter)
NUnit.Core.TestSuite:Run(EventListener, ITestFilter)
UnityTest.NUnitTestEngine:ExecuteTestSuite(TestSuite, ITestRunnerCallback, TestFilter) (at Assets/UnityTestTools/UnitTesting/Editor/TestRunner/NUnitTestEngine.cs:139)
UnityTest.NUnitTestEngine:RunTests(TestFilter, ITestRunnerCallback) (at Assets/UnityTestTools/UnitTesting/Editor/TestRunner/NUnitTestEngine.cs:91)
UnityTest.UnitTestView:StartTestRun(TestFilter, ITestRunnerCallback) (at Assets/UnityTestTools/UnitTesting/Editor/TestRunner/TestRunner.cs:84)
UnityTest.UnitTestView:RunTests(TestFilter) (at Assets/UnityTestTools/UnitTesting/Editor/TestRunner/TestRunner.cs:53)
UnityTest.UnitTestView:RunTests() (at Assets/UnityTestTools/UnitTesting/Editor/TestRunner/TestRunner.cs:35)
UnityTest.UnitTestView:OnGUI() (at Assets/UnityTestTools/UnitTesting/Editor/TestRunner/UnitTestView.cs:79)
UnityEditor.DockArea:OnGUI()

我尝试通过actionMaster = gameObject.GetComponent<ActionMaster>(); 简单地添加一个组件,但我得到一个空点错误。我怎样才能在没有警告的情况下完成这项工作?

【问题讨论】:

    标签: c# unit-testing unity3d unity-test-tools


    【解决方案1】:

    MonoBehaviour 应该被实例化到 GameObject 上的场景中 - 因此您不能只调用 new,因为它与游戏对象无关。

    要测试从 MonoBehaviour 派生的组件,您需要创建一个预制件(上面有您的组件),或者您需要创建(或使用现有的)游戏对象并添加您的组件:

    GameObject go = new GameObject();
    go.AddComponent<ActionMaster>();
    

    注意:虽然这在技术上是您问题的答案,但您需要注意,当您运行上述代码时,Awake() 调用会立即运行,但 Start() 和 Update() 不会运行到下一帧 - 到那时您的测试可能已经全部结束。

    【讨论】:

    • 不用担心。嘿,当您开始测试时,还请查看 Unity 的新断言库:blogs.unity3d.com/2015/08/25/the-unity-assertion-library
    • 所以这段代码确实有效,但它有将对象添加到层次结构的负面影响。有什么建议可以在不添加游戏对象的情况下完成这项工作?
    • 调用销毁(go);测试后清理它。
    • 它需要 DestroyImmediate,而且奇怪的是似乎并没有破坏场景中的对象......奇怪......不知道这是不是一个错误......
    • Destroy 会将其从场景中移除,但在帧结束时。如果它没有从场景中移除,则参考不再正确(也许您创建了多个?) .另一种方法是将您的游戏对象命名为“test”,然后在拆卸时删除所有具有该名称的游戏对象。
    【解决方案2】:

    @peterept 的回答大部分是正确的,但它实际上在层次结构中创建了对象。更好的方法是实际创建一个名为ActionMaster的对象,然后在代码中找到,如下:

    actionMaster= GameObject.FindObjectOfType<ActionMaster>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      相关资源
      最近更新 更多