在Unity3d测试脚本中,如何从另一个类调用静态函数?

时间:2018-12-19 06:26:38

标签: unit-testing unity3d nunit

我在Unity3d项目中有两个文件。一种是在编辑模式下运行的测试脚本。另一个是带有静态函数的单个类,我想从测试脚本中调用它。

这是我的测试脚本:

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

public class NewTestScript 
{

    [Test]
    public void TestAnotherStaticFunction() 
    {
        int a = NewBehaviourScript.FunctionUnderTest(1);
        int b = 1;

        // Use the Assert class to test conditions.
        Assert.IsTrue(a == b);
    }
}

这是我正在测试的功能:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour 
{
    /// <summary>
    /// the stupidest function in the world, 
    /// used to verify tests.
    /// </summary>
    public static int FunctionUnderTest(int a)
    {
        return a;
    }
}

这给了我Unity编译器的错误(我不在Unity之外构建):

资产/TestS/NewTestScript.cs(12,17):错误CS0103:名称“ NewBehaviourScript”在当前上下文中不存在

这些以编辑模式运行。

我尝试从被测函数和调用代码中添加和删除 SuperTestNameSpace 命名空间。

我尝试从统一生成的 .asmdef 文件中添加/删除文件,尽管这通常会导致其他编译错误。

我以前的单元测试经验主要是在Visual Studio或VSCode中进行的,并且我试图获得我的unity3d测试经验以与我先前的测试环境经验相匹配。

编辑模式测试中功能是否从根本上受到限制,还是我缺少一些愚蠢的东西?

有关装配的进一步说明。看来这里有两个程序集在起作用: Assembly-CSharp.dll 包含我正在测试的代码,而 TestS.dll 包含我的测试代码。我认为我的问题可以归结为:如何将TestS.dll程序集的引用添加到 Assembly-CSharp.dll 。我知道如何在Visual Studio中执行此操作(通过VS中的上下文菜单或直接编辑csproj文件),但是我看不到如何在Unity3d中执行此操作。我对csproj文件所做的任何编辑都经常被unity覆盖,并且当检查器中有一个“引用”部分(参见图片)时,我无法添加 Assembly-CSharp.dll 作为引用。

These are the inspector settings for TestS.asmdef. While there's an option to add references, I can't add a reference to Assembly-CSharp.dll, which is where my code-under-test lives.

3 个答案:

答案 0 :(得分:2)

好,我知道了。有两件事发生:

  1. 编辑器测试必须位于名为“编辑器”的文件夹下面。统一编辑器没有为您执行此操作真是令人讨厌。
  2. 您需要为被测代码 定义一个程序集定义,并将测试代码的引用添加到新创建的程序集定义中。 必须在Unity编辑器用户界面中完成。

默认情况下,unity将脚本代码添加到名为 Assembly-CSharp.dll 的程序集中,并且由于未知原因,我的编辑模式测试代码未引用该程序集。我不确定这是Unity中的错误还是设计使然,但是显式创建和引用程序集定义已清除了一切。

答案 1 :(得分:1)

主要问题是当前您正在尝试致电

NewBehaviourScript(1);

不存在的构造函数...

代替方法

using SuperTestNameSpace;

//...

NewBehaviourScript.FunctionUnderTest(1);

或直接在调用中使用名称空间

SuperTestNameSpace.NewBehaviourScript.FunctionUnderTest(1);

还要确保文件名与类名完全匹配。因此,您的情况应该是

NewBehaviourScript.cs

请注意,.cs不是由Unity在Project视图中打印的,因此它应该显示NewBehaviourScript


为什么它不能与using SuperTestNameSpace;一起编译?有什么错误吗?

如果有例外

  

资产/TestS/NewTestScript.cs(14,17):错误CS0103:名称'NewBehaviourScript'在当前上下文中不存在

仅在VisualStudio中显示,但是脚本在Unity中可以很好地编译,尤其是在添加新脚本之后,它有助于简单地关闭并重新启动VS。

在某些情况下,它还有助于关闭Unity和VS,删除AssetsProjectSettings之外的所有文件和文件夹(如果受版本控制,则属于{{1 }},.git.gitignore等),尤其是删除.gitattributesLibrary文件夹以及所有.vs.csproj文件。

然后再次打开Unity并重新编译所有内容。

答案 2 :(得分:0)

确保在编辑器文件夹中包含NewBehaviourScript类不是的文件。

移动“资源”(根)文件夹中的两个脚本,然后重试。