【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 消失。
相关推荐
jtymyxmz6 小时前
《Unity Shader》8.4 透明度混合
unity·游戏引擎
世洋Blog7 小时前
利用<<左移运算符优雅的设计游戏能力的任意组合和判断
游戏·unity·c#
毛甘木18 小时前
Unity MonoPInvokeCallback 使用教程
c++·unity
程序员三藏19 小时前
软件测试之压力测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
心疼你的一切19 小时前
Unity开发Rokid应用之离线语音指令交互模型
android·开发语言·unity·游戏引擎·交互·lucene
Sator121 小时前
Unity使用OpenXR时,初始化失败的问题
unity·游戏引擎·vr
雨泽‎1 天前
Unity在URP中开启后处理导致RenderTexture存在背景
unity·游戏引擎·图形渲染
程序员小远2 天前
如何搭建Appium环境?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
车端域控测试工程师2 天前
Autosar网络管理测试用例 - TC003
c语言·开发语言·学习·汽车·测试用例·capl·canoe
十二测试录2 天前
测试用例,常见的一些问题
功能测试·单元测试·测试用例·压力测试·可用性测试