Unit testing 在Unity3d测试脚本中,如何从另一个类调用静态函数?
我在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
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点,为了创建程序集定义,页面如下: