【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

内容示意:

json 复制代码
{
  "name": "SuperDuckClicker",
  "references": [],
  "includePlatforms": [],
  "excludePlatforms": [],
  "allowUnsafeCode": false
}

这会生成一个独立程序集,名字为 SuperDuckClicker.dll

(这样命名空间 SuperDuckClicker.Core 就有归属了)


步骤 2:在 Tests 文件夹创建对应 asmdef

位置:Assets/Tests/Editor/

文件名:SuperDuckClicker.Tests.Editor.asmdef

内容示意:

json 复制代码
{
  "name": "SuperDuckClicker.Tests.Editor",
  "references": [
    "SuperDuckClicker"   // ★ 引用主程序集
  ],
  "optionalUnityReferences": [
    "TestAssemblies"     // 允许 NUnit 测试
  ],
  "includePlatforms": ["Editor"]
}

这样测试程序集就能访问 SuperDuckClicker 的所有类。


✅ 验证:

重新编译后,错误消失。

测试用例就能访问:

csharp 复制代码
using SuperDuckClicker.Core;

⚙️ 方案 2:不使用 asmdef(适合小项目)

如果你还没有引入 asmdef,可以暂时直接放在同一个编译组里:

  • CurrencyTester.csAssets/Tests/Editor/

    移动到 Assets/Scripts/Core/Assets/Tests/RuntimeDebug/(不在 Editor-only 文件夹)

  • 或者去掉命名空间前缀:

    csharp 复制代码
    // 直接引用类,不写 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,记得重新加载解决方案。

  • 测试脚本中推荐加上:

    csharp 复制代码
    using NUnit.Framework;
    using SuperDuckClicker.Core;

附上两个完整的asmdef文件内容:

可直接在 Unity 编辑器中创建的 两个 Assembly Definition (.asmdef) 文件内容,

一份放主工程,一份放测试文件夹。

你只需在 Unity 中右键 → Create → Assembly Definition → 粘贴内容 → 保存即可。


🧩 文件 1:主工程程序集

路径: Assets/Scripts/SuperDuckClicker.asmdef

json 复制代码
{
  "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

json 复制代码
{
  "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 命名空间下的类(例如 CurrencyManagerTickService 等)

⚙️ 验证步骤

  1. 将上述两个 .asmdef 文件分别放入对应文件夹。
  2. Unity 会自动重新编译(等待 3~5 秒)。
  3. 打开 Test Runner → 运行你的 CurrencyTester 测试。
  4. ✅ 错误 CS0246 消失。
相关推荐
AA陈超11 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-28 构建属性菜单小部件控制器
c++·游戏·ue5·游戏引擎·虚幻
地狱为王12 小时前
Unity使用PP-MattingV2实现人像分割
unity·游戏引擎
在路上看风景14 小时前
7.1 阴影贴图
unity
lrh302514 小时前
Unity 高效 ListView GridView
unity·高效·复用·uilistview·uigridview
星夜泊客17 小时前
[特殊字符] Unity 对象判空机制混乱原因总结(上篇)
unity·游戏引擎
应用市场1 天前
Godot C++开发指南:正确获取节点的Forward/Up/Right方向向量
c++·游戏引擎·godot
天才测试猿1 天前
Jmeter基础知识详解
自动化测试·软件测试·测试工具·jmeter·测试用例·接口测试·性能测试
小南家的青蛙1 天前
O3DE社区发布2510.0版本
游戏引擎·图形引擎
程序员三藏1 天前
软件测试之环境搭建及测试流程
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例