C# Unity测试工具使用GameObject进行单元测试;您正试图使用';新';关键词。这是不允许的。”;

C# Unity测试工具使用GameObject进行单元测试;您正试图使用';新';关键词。这是不允许的。”;,c#,unit-testing,unity3d,unity-test-tools,C#,Unit Testing,Unity3d,Unity Test Tools,我正在使用Unity测试工具框架。我的单元测试代码如下所示(更多) ActionMaster如下所示: public class ActionMaster : MonoBehaviour { } 如果我运行一个测试,那么我会在类似的actionMaster=newactionmaster()上得到以下警告 我试着简单地添加一个组件,方法是actionMaster=gameObject.GetComponent(),但我得到一个空点错误。如何在没有警告的情况下使其正常工作?预期MonoBehav

我正在使用Unity测试工具框架。我的单元测试代码如下所示(更多)

ActionMaster如下所示:

public class ActionMaster : MonoBehaviour {
}
如果我运行一个测试,那么我会在类似的
actionMaster=newactionmaster()上得到以下警告


我试着简单地添加一个组件,方法是
actionMaster=gameObject.GetComponent(),但我得到一个空点错误。如何在没有警告的情况下使其正常工作?

预期MonoBehavior将被实例化到游戏对象的场景中-因此您不能只调用new,因为它与游戏对象无关

要测试从MonoBehavior派生的组件,您需要创建一个实例化预制(其中包含您的组件),或者您需要创建(或使用现有)游戏对象并添加您的组件:

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

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

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

actionMaster= GameObject.FindObjectOfType<ActionMaster>();
actionMaster=GameObject.FindObjectOfType();

不用担心。嘿,当您开始测试时,还可以查看Unity的新断言库:因此,这段代码实际上是可行的,但它会对向层次结构添加对象产生负面影响。有没有建议在没有添加游戏对象的情况下执行此操作?请调用Destroy(go);在你的测试后清理它。它需要立即销毁,而且奇怪的是,似乎没有销毁场景中的对象。。。奇怪的想知道这是否是一个bug…Destroy会将其从场景中删除,但在帧的末尾。如果它没有将其从场景中删除,则引用不再正确(可能是您创建了多个?)。另一种方法是将游戏对象命名为“test”,然后在拆卸时移除所有具有该名称的游戏对象。
GameObject go = new GameObject();
go.AddComponent<ActionMaster>();
actionMaster= GameObject.FindObjectOfType<ActionMaster>();