【问题标题】:In Unity3d test scripts, how do I call a static function from another class?在 Unity3d 测试脚本中,如何从另一个类调用静态函数?
【发布时间】:2019-05-19 14:47:03
【问题描述】:

我在 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 之外构建的):

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

这些在编辑模式下运行。

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

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

我以前的单元测试经验主要是在 Visual Studio 或 VSCode 中,我正在尝试让我的 unity3d 测试经验与我之前的测试环境经验相匹配。

在编辑模式测试中是否存在根本上受限的功能,还是我遗漏了一些愚蠢的东西?

进一步阐述所涉及的程序集。看起来这里有两个程序集:Assembly-CSharp.dll 包含我的测试代码,TestS.dll 包含我的测试代码。我相信我的问题归结为:如何将 TestS.dll 程序集的引用添加到 Assembly-CSharp.dll。我知道如何在 Visual Studio 中执行此操作(通过 VS 中的上下文菜单或直接编辑 csproj 文件),但是我不知道如何在 Unity3d 中执行此操作。我对 csproj 文件所做的任何编辑都经常被统一覆盖,虽然检查器中有一个“参考”部分(见图),但我无法添加 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.

【问题讨论】:

    标签: unit-testing unity3d nunit


    【解决方案1】:

    好的,我想通了。发生了两件事:

    1. 编辑器测试需要位于名为 editor 的文件夹下。统一编辑器不为您执行此操作真的很烦人。
    2. 您需要为被测代码创建一个程序集定义将测试代码中的引用添加到新创建的程序集定义中。这必须在 Unity 编辑器 UI 中完成。

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

    【讨论】:

    【解决方案2】:

    主要问题是当前您正在尝试调用

    NewBehaviourScript(1);
    

    构造函数不存在...

    代替方法

    using SuperTestNameSpace;
    
    //...
    
    NewBehaviourScript.FunctionUnderTest(1);
    

    或者直接在调用中使用命名空间

    SuperTestNameSpace.NewBehaviourScript.FunctionUnderTest(1);
    

    还要确保文件名与类名完全匹配。所以在你的情况下应该是

    NewBehaviourScript.cs
    

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


    为什么它不能用using SuperTestNameSpace; 编译?错误是什么?

    如果那个异常

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

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

    在某些情况下,它还有助于关闭 Unity 和 VS,删除除 AssetsProjectSettings 之外的所有文件和文件夹(如果您处于版本控制之下,则属于它的任何内容,例如 .git.gitignore , .gitattributes 等) 特别是删除 Library, .vs 文件夹和所有 .csproj.sln 文件。

    比再次打开 Unity 并让它重新编译所有内容。

    【讨论】:

    • 谢谢,你是对的,因为我没有使用正确的语法调用静态函数。但是,我仍然在脚本上收到类似的错误。 NewBehaviourScript 仍然未被识别为有效的命名空间。我已经改写了原始问题并更新了我从 Unity 收到的错误消息。
    【解决方案3】:

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

    将两个脚本移到 Assets(根)文件夹中,然后重试。

    【讨论】:

    • 谢谢,我已经确认它不在编辑器文件夹中。文件夹结构为:\Assets\Scenes\NewBehaviourScript.cs \Assets\TestS\NewTestScript.cs \Assets\TestS\TestS.asmdef
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2016-07-02
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多