В тестовых сценариях Unity3d как вызвать статическую функцию из другого класса? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть два файла в проекте Unity3d.Одним из них является тестовый скрипт, который запускается в режиме редактирования.Другой - это один класс со статическими функциями, которые я хотел бы вызвать из тестовых сценариев.

вот мой тестовый сценарий:

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

public class NewTestScript 
{

    [Test]
    public void TestAnotherStaticFunction() 
    {
        int a = NewBehaviourScript.FunctionUnderTest(1);
        int b = 1;

        // Use the Assert class to test conditions.
        Assert.IsTrue(a == b);
    }
}

вот моя тестируемая функция:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour 
{
    /// <summary>
    /// the stupidest function in the world, 
    /// used to verify tests.
    /// </summary>
    public static int FunctionUnderTest(int a)
    {
        return a;
    }
}

Это дает мне ошибку от компилятора Unity (я не строю вне Unity):

Assets / TestS / NewTestScript.cs (12,17): ошибка CS0103: Имя `NewBehaviourScript 'не существует в текущем контексте

Они работают в режиме редактирования.

Я попытался добавить и удалить пространство имен SuperTestNameSpace из тестируемой функции и вызывающего кода.

Я пытался добавить / удалить файлы из файла .asmdef , который был автоматически сгенерирован с помощью unity, хотя это обычно приводит к другим ошибкам компиляции.

Мой предыдущий опыт модульного тестирования в основном был в Visual Studio или VSCode, и я стараюсь, чтобы мой опыт тестирования unity3d соответствовал моему предыдущему опыту среды тестирования.

Существуют ли принципиально ограниченные функциональные возможности в тестах режима редактирования или я что-то упускаю из строя?

Дальнейшее уточнение используемых сборок.Похоже, что здесь находятся две сборки: Assembly-CSharp.dll содержит мой тестируемый код и TestS.dll содержит мой тестовый код.Я считаю, что мои вопросы сводятся к следующему: как добавить ссылку из сборки TestS.dll в Assembly-CSharp.dll .Я бы знал, как это сделать в Visual Studio (либо через контекстное меню в VS, либо непосредственно редактируя файл csproj), однако я не вижу, как это сделать в Unity3d.Любое редактирование, которое я делаю в файле csproj, часто перезаписывается единицей, и хотя в инспекторе есть раздел «ссылки» (см. Рисунок), я не могу добавить Assembly-CSharp.dll в качестве ссылки.

Это настройки инспектора для TestS.asmdef.Хотя есть возможность добавлять ссылки, я не могу добавить ссылку на Assembly-CSharp.dll, в которой живет мой тестируемый код.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Убедитесь, что файл, содержащий ваш класс NewBehaviourScript НЕ внутри папки редактора.

Переместите оба сценария в папку «Ресурсы» (корневую) и повторите попытку.

0 голосов
/ 29 декабря 2018

Хорошо, я понял это.Происходили две вещи:

  1. Тестовые редакторы должны находиться в папке с именем editor.Это действительно раздражает, что редактор единства не делает это для вас.
  2. Необходимо иметь определение сборки для тестируемого кода и добавить ссылку из тестового кода во вновь созданное определение сборки.Это должно быть выполнено в пользовательском интерфейсе редактора Unity.

по умолчанию Unity добавляет код вашего скрипта в сборку с именем Assembly-CSharp.dll ипо неизвестным причинам на эту сборку не ссылается мой тестовый код режима редактирования.Я не уверен, является ли это ошибкой в ​​Unity или это сделано по замыслу, но явное создание и ссылка на определение сборки прояснили ситуацию.

0 голосов
/ 19 декабря 2018

Основная проблема заключается в том, что вы пытаетесь вызвать конструктор

NewBehaviourScript(1);

, который не существует ...

вместо метода

using SuperTestNameSpace;

//...

NewBehaviourScript.FunctionUnderTest(1);

или, альтернативно, с пространством имен в вызове напрямую

SuperTestNameSpace.NewBehaviourScript.FunctionUnderTest(1);

Также убедитесь, что имя файла точно соответствует имени класса.Так что в вашем случае это должно быть

NewBehaviourScript.cs

Обратите внимание, что .cs не печатается Unity в представлении Project, поэтому там должно быть написано NewBehaviourScript.


Почему он не компилируется с using SuperTestNameSpace;?В чем ошибка?

Если это исключение

Assets / TestS / NewTestScript.cs (14,17): ошибка CS0103: имя `NewBehaviourScript 'не существует в текущемcontext

отображается только в VisualStudio, но сценарий, хорошо компилируемый в Unity, особенно после добавления нового сценария, помогает просто закрыть и перезапустить VS.

В некоторых случаях это также помогаетзакройте Unity и VS, удалите все файлы и папки, кроме Assets и ProjectSettings (и, если вы находитесь под контролем версий, все, что ему принадлежит, например, .git, .gitignore, .gitattributes и т. д.), в частности, удалитеПапка Library, .vs и все файлы .csproj и .sln.

Чем снова открыть Unity и позволить ему перекомпилировать все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...