首页 > 解决方案 > 如何在 Unity 中设置单元测试并修复缺少的程序集引用错误?

问题描述

我创建了以下结构:

├── Assets
├── Scenes
├── Scripts
│   └── MyExample.cs
├── Tests
│   ├── MyExampleTest.cs
│   └── Tests.asmdef

现在,当我在 Unity 的 Test Runner 窗口中单击 Run All 时,出现以下错误:

The type or namespace name `MyExample' could not be found. Are you missing an assembly reference?

在 Visual Studio 中,我有两个项目:

我在第二个项目中添加了 Assembly-CSharp 作为参考。Visual Studio 能够构建没有错误的解决方案。

有谁知道如何为 Unity 项目正确设置 UnitTest 回归?

这是 Tests.asmdef

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

MyExampleTest.cs

using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using abc;

public class MyExampleTest{

    [Test]
    public void NewTestScriptSimplePasses() {
        // Use the Assert class to test conditions.
    }

    [UnityTest]
    public IEnumerator NewTestScriptWithEnumeratorPasses() {
        abc.Example m;
        Assert.That(false);
        yield return null;
    }
}

我的例子.cs

namespace abc
{
    public class Example
    {


    }
}

标签: c#unit-testingunity3d

解决方案


尝试使用内置的 Test Runner UI 设置您的测试程序集文件夹和第一个测试脚本。

使用Window -> Test Runner -> EditMode -> "Create Test Assembly Folder",一旦导航到新的测试程序集文件夹,请使用Create Test Script in current folder按钮。

特别是,Tests.asmdef与默认设置(在 Unity 2018.1 中)相比,您缺少“编辑器”包含。

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ]
}

您不必为了设置测试而在 Visual Studio 项目中手动执行任何操作。

请注意,当我的程序集文件设置为“任何平台”时(如您的问题):

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

我的测试未显示在 Test Runner 窗口中。

当我的程序集文件明确设置为仅包含“编辑器”平台时(根据我之前的示例),我的测试会正确显示在“测试运行器”窗口中。

(这种行为对我来说似乎有点违反直觉。)


您还需要为您的脚本设置一个程序集定义。在您的Scripts, 文件夹下,创建一个程序集定义文件MyScriptAssembly.asmdef(使用 Unity 菜单Assets -> Create -> Assembly Definition或手动):

{
    "name": "MyScriptAssembly"
}

然后,确保您Tests.asmdef参考您的脚本程序集:

{
    "name": "Tests",
    "references": [
        "MyScriptAssembly"
    ],
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ],
    "excludePlatforms": [],
    "allowUnsafeCode": false
}

您也可以在 Unity Editor 检查器窗口中进行设置。选择 .asmdef 文件时,请参阅检查器中的“参考”:

装配定义检查器窗口

(有关详细信息,请参阅Unity 关于程序集定义文件的文档


推荐阅读