【Unity踩坑】Unity测试用例命名空间错误解决方案
在Unity中,可以通过Windows - General - Test Runner来创建和运行测试用例。
首先需要创建Test路径,这时候会有一个与文件夹同名的asmdef文件被创建。之后就可以在这个文件夹里创建测试用例。
本文要解决的问题是,无法找到测试用例中的命名空间。
具体的错误是:error CS0246: The type or namespace name ‘SuperDuckClicker’ could not be found (are you missing a using directive or an assembly reference?)
这个错误是 Unity 里很常见的 “程序集隔离问题(Assembly Definition 隔离)”,
具体原因与 测试脚本所在文件夹(Tests/Editor) 有关。下面详细说明原因与解决方案👇
🧩 错误原因分析
错误信息:
error CS0246: The type or namespace name 'SuperDuckClicker' could not be found
意思是:
当前测试脚本所在的程序集(assembly)找不到 SuperDuckClicker.Core 这个命名空间。
在 Unity 里,脚本的编译分组由 “Assembly Definition (.asmdef)” 文件决定。
而你的测试脚本放在了 Assets/Tests/Editor/ 下,这个目录默认属于 Editor-only 测试程序集,
并不会自动引用你主工程的代码(Assets/Scripts/Core/)。
✅ 解决方案(按推荐优先级)
✅ 方案 1:给主工程和测试分别添加 Assembly Definition 文件(推荐)
步骤 1:在你的主脚本目录创建 asmdef
位置:Assets/Scripts/
文件名:SuperDuckClicker.asmdef
内容示意:
{"name": "SuperDuckClicker","references": [],"includePlatforms": [],"excludePlatforms": [],"allowUnsafeCode": false
}
这会生成一个独立程序集,名字为 SuperDuckClicker.dll。
(这样命名空间 SuperDuckClicker.Core 就有归属了)
步骤 2:在 Tests 文件夹创建对应 asmdef
位置:Assets/Tests/Editor/
文件名:SuperDuckClicker.Tests.Editor.asmdef
内容示意:
{"name": "SuperDuckClicker.Tests.Editor","references": ["SuperDuckClicker" // ★ 引用主程序集],"optionalUnityReferences": ["TestAssemblies" // 允许 NUnit 测试],"includePlatforms": ["Editor"]
}
这样测试程序集就能访问 SuperDuckClicker 的所有类。
✅ 验证:
重新编译后,错误消失。
测试用例就能访问:
using SuperDuckClicker.Core;
⚙️ 方案 2:不使用 asmdef(适合小项目)
如果你还没有引入 asmdef,可以暂时直接放在同一个编译组里:
-
把
CurrencyTester.cs从Assets/Tests/Editor/
移动到Assets/Scripts/Core/或Assets/Tests/RuntimeDebug/(不在 Editor-only 文件夹) -
或者去掉命名空间前缀:
// 直接引用类,不写 using SuperDuckClicker.Core; var cm = CurrencyManager.Instance;
⚠️ 缺点:测试脚本可能会被打包进游戏(不推荐用于正式项目)。
🧠 方案 3:修改命名空间结构(备选)
如果你项目暂时没有使用 namespace SuperDuckClicker.Core,
可以先去掉命名空间(即去掉最外层 namespace 包裹),
测试脚本就能直接访问类。
但这不推荐用于成品结构,只适合原型期。
💡 推荐实践(适合 Super Duck Clicker 项目)
| 模块 | 位置 | asmdef 名称 | 引用关系 |
|---|---|---|---|
| 游戏逻辑代码 | Assets/Scripts/ | SuperDuckClicker.asmdef | — |
| 编辑器扩展 | Assets/Editor/ | SuperDuckClicker.Editor.asmdef | 引用主 asmdef |
| 测试代码 | Assets/Tests/Editor/ | SuperDuckClicker.Tests.Editor.asmdef | 引用主 asmdef |
这样:
- 测试脚本可以访问游戏逻辑;
- 打包时
Tests目录不会进入构建; - 代码结构清晰可维护。
🧩 小贴士
-
修改 .asmdef 后一定要等 Unity 重新编译(几秒钟)。
-
如果你使用 Rider / VSCode 等 IDE,记得重新加载解决方案。
-
测试脚本中推荐加上:
using NUnit.Framework; using SuperDuckClicker.Core;
附上两个完整的asmdef文件内容:
可直接在 Unity 编辑器中创建的 两个 Assembly Definition (.asmdef) 文件内容,
一份放主工程,一份放测试文件夹。
你只需在 Unity 中右键 → Create → Assembly Definition → 粘贴内容 → 保存即可。
🧩 文件 1:主工程程序集
路径: Assets/Scripts/SuperDuckClicker.asmdef
{"name": "SuperDuckClicker","rootNamespace": "SuperDuckClicker","references": [],"includePlatforms": [],"excludePlatforms": [],"allowUnsafeCode": false,"overrideReferences": false,"precompiledReferences": [],"autoReferenced": true,"defineConstraints": [],"versionDefines": [],"noEngineReferences": false
}
✅ 作用说明:
- 生成主项目逻辑的独立程序集
SuperDuckClicker.dll - 命名空间默认为
SuperDuckClicker(例如SuperDuckClicker.Core) - 自动引用 Unity 引擎、标准库
- 所有脚本放在
Assets/Scripts/或其子目录下的,会归属此程序集
🧩 文件 2:测试程序集
路径: Assets/Tests/Editor/SuperDuckClicker.Tests.Editor.asmdef
{"name": "SuperDuckClicker.Tests.Editor","rootNamespace": "","references": ["SuperDuckClicker"],"includePlatforms": ["Editor"],"excludePlatforms": [],"allowUnsafeCode": false,"overrideReferences": false,"precompiledReferences": [],"autoReferenced": true,"defineConstraints": [],"versionDefines": [],"noEngineReferences": false,"optionalUnityReferences": ["TestAssemblies"]
}
✅ 作用说明:
- 仅在 Editor 模式 编译(不会进入构建)
- 引用主程序集
SuperDuckClicker - 自动获得 Unity Test Framework (
NUnit) - 可以访问所有在
SuperDuckClicker命名空间下的类(例如CurrencyManager、TickService等)
⚙️ 验证步骤
- 将上述两个
.asmdef文件分别放入对应文件夹。 - Unity 会自动重新编译(等待 3~5 秒)。
- 打开 Test Runner → 运行你的
CurrencyTester测试。 - ✅ 错误
CS0246消失。
