Unit тесты Unity3d, нет ссылки на основную сборку

210
09 августа 2021, 14:50

Изучаю тесты в Unity3D

Там два вида тестов - playMode и editMode

Оба говорят сгенерировать папку Tests и в ней писать скрипт для теста.

Содержимое скрипта тоже одинаковое.

using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
namespace Tests
{
    public class NewTestScript1
    {
        // A Test behaves as an ordinary method
        [Test]
        public void NewTestScript1SimplePasses()
        {
            // Use the Assert class to test conditions
        }
        // A UnityTest behaves like a coroutine in Play Mode. In Edit Mode you can use
        // `yield return null;` to skip a frame.
        [UnityTest]
        public IEnumerator NewTestScript1WithEnumeratorPasses()
        {
            // Use the Assert class to test conditions.
            // Use yield to skip a frame.
            yield return null;
        }
    }
}

Одно но - если в основной папке проекта мы создадим решение, для которого в общем то и писались эти тесты, то в PlayMode ссылка на это решение работает, а в EditMode выдает ошибку

Не удалось найти тип или имя пространства имен TestComposing(возможно, отсутствует директива using или ссылка на сборку)

Код выдающий эту ошибку, такой

    [UnityTest]
    public IEnumerator NewTestScriptWithEnumeratorPasses()
    {
        //Именно TestComposing в EditMode оно не находит. Но находит в PlayMode!
        TestComposing c = new TestComposing();
        var r = c.TestBuilderTestRun();
        Debug.Log(r.abilities.First().GetType() + " " + r.money + " ");
        yield return null;
    }

Обращаемся мы из неймспейса Tests (создан юнити) в глобальный неймспейс. (TestComposing лежит просто без указания неймспейса, просто public class).

Решарпер предлагает сделать ссылку на Assembly, и успешно её делает - но юнити продолжает считать что мы пытаемся взять что то несуществующее, и пишет нам в консоли.

Assets\Scenes\Tests\NewTestScript.cs(25,13): error CS0246: The type or namespace name 'TestComposing' could not be found (are you missing a using directive or an assembly reference?)

После перезагрузки ситуация сохраняется, и ссылки сделанные решарпером, снова пропадают.

Прикладываю скриншот asmdef тестовой папки. Да, видно что там стоит галка Test Assemblies, но если её убрать, то сам Test Runner не видит это как EditMode тест http://prntscr.com/papayx

Answer 1

Нашел решение с помощью подсказок @RiotBr3aker и чтения англоязычного SO. В общем, если пользоваться EditMode тестами, надо для каждой сборки создавать свой Create->AssemblyDefinition

И в тестовом AssemblyDefinition указывать в окне AssemblyDefinitionReferences свою ссылку на AssemblyDefinition в папке с вашими основными скриптами. В случае если у вас несколько папок со скриптами, это скорее всего выльется необходимость везде создавать AssemblyDefinition и указывать референсы. Звучит крайне неудобно, но похоже это единственный способ запускать EditMode тесты по всему проекту.

Ответ от англоязычного SO https://stackoverflow.com/questions/50223866/how-to-set-up-unit-tests-in-unity-and-fix-missing-assembly-reference-error

READ ALSO
json file serialization. Reflection

json file serialization. Reflection

Необходимо Передать в метод string[], а на выходе получить значение объекта

123
Как встроить конфигурационный файл в приложение c#?

Как встроить конфигурационный файл в приложение c#?

По этому вопросу было много ответов, только ничего не подходит, поскольку склеивание файла лишает смысла всю программу, и я пишу в файл настройки,...

329
Баги при работе с клавиатурными хуками

Баги при работе с клавиатурными хуками

Есть участок кода где перехватываются клавиши и блокируются:

216