如何在Unity中设置单元测试并修复缺少的程序集引用错误?

时间:2018-05-07 23:42:14

标签: c# unit-testing unity3d

我创建了以下结构:

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

现在,当我点击Run Run窗口中的Run All时,我发现以下错误:

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

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

  • Assembly-CSharp(包含src)

  • 测试(包含测试)

我在第二个项目中添加了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;
    }
}

MyExample.cs

namespace abc
{
    public class Example
    {


    }
}

2 个答案:

答案 0 :(得分:29)

尝试使用内置的Test Runner UI来设置Test Assembly文件夹和第一个Test脚本。

使用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窗口中。

当我的程序集文件显式设置为仅包含“编辑器”平台时(根据我之前的示例),我的测试在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文件时,请参阅检查器中的“参考”:

assembly definition inspector window

(有关详细信息,请参阅Unity's documentation on assembly definition files

答案 1 :(得分:1)

Lite,“零组件”,替代设置:

Assets
├── Scenes
├── Scripts
│   └── MyGameScript.cs
├── Editor
│   └── MyGameScriptTests.cs

Editor 目录中的所有脚本都可以引用 NUnit.Framework 命名空间,这些测试将显示在 Test Runner 窗口中。

它的主要优点是简单。我确定某处有缺点,但对于日常项目来说,这是一种祝福。