Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在Unity3d测试脚本中,如何从另一个类调用静态函数?_Unit Testing_Unity3d_Nunit - Fatal编程技术网

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

Unit testing 在Unity3d测试脚本中,如何从另一个类调用静态函数?,unit-testing,unity3d,nunit,Unit Testing,Unity3d,Nunit,我在Unity3d项目中有两个文件。一个是在编辑模式下运行的测试脚本。另一个是一个带有静态函数的类,我想从测试脚本中调用它 以下是我的测试脚本: using UnityEngine; using UnityEngine.TestTools; using NUnit.Framework; using System.Collections; public class NewTestScript { [Test] public void TestAnotherStaticFunc

我在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;
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类NewBehaviourScript:MonoBehavior
{
/// 
///世界上最愚蠢的功能,
///用于验证测试。
/// 
公共静态int FunctionUnderTest(int a)
{
返回a;
}
}
这给了我Unity编译器的错误(我不是在Unity之外构建):

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

它们在编辑模式下运行

我已经尝试从被测函数和调用代码中添加和删除SuperTestNameSpace

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

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

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

进一步阐述所涉及的组件。这里似乎有两个程序集:Assembly CSharp.dll包含正在测试的代码,而TestS.dll包含我的测试代码。我相信我的问题可以归结为:如何将TestS.dll程序集的引用添加到程序集CSharp.dll。我知道如何在VisualStudio中执行此操作(通过VS中的上下文菜单或直接编辑csproj文件),但我不知道如何在Unity3d中执行此操作。我对csproj文件所做的任何编辑都经常被unity覆盖,虽然inspector中有一个“references”部分(见图),但我不能将Assembly CSharp.dll添加为引用


主要问题是当前您正在尝试呼叫

NewBehaviourScript(1);
不存在的构造函数

而不是方法

使用SuperTestNameSpace;
//...
NewBehaviourScript.FunctionUnderTest(1);
或者直接使用调用中的命名空间

SuperTestNameSpace.NewBehaviourScript.FunctionUnderTest(1);

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

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


为什么它不使用SuperTestNameSpace编译
?错误是什么

如果有例外

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

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

在某些情况下,它还有助于关闭Unity和VS,删除除
资产
项目设置
之外的所有文件和文件夹(如果您受版本控制,则删除属于它的任何内容,例如
.git
.gitignore
.gittributes
等),尤其是删除
.vs
文件夹和所有
.csproj
.sln
文件


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

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


将两个脚本移动到资产(根目录)文件夹中,然后重试。

好的,我解决了这个问题。发生了两件事:

  • 编辑器测试需要位于名为Editor的文件夹下。unity编辑器没有为你做这件事,真让人恼火
  • 您需要为测试中的代码创建一个程序集定义,并将测试代码中的引用添加到新创建的程序集定义中。这必须在Unity编辑器UI中完成

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

    谢谢,你是对的,我没有用正确的语法调用静态函数。但是,我仍然在脚本上收到类似的错误。NewBehaviourScript仍然无法识别为有效的命名空间。我已经重新编写了原始问题,并更新了从Unity收到的错误消息。谢谢,我已经确认它不在编辑器文件夹中。文件夹结构是:
    \Assets\Scenes\NewBehaviourScript.cs\Assets\TestS\NewTestScript.cs\Assets\TestS\TestS.asmdef
    这对我帮助很大,对于第2点,为了创建程序集定义,页面如下: