В настоящее время я разрабатываю игру для Unity 2019 и C # и использую для нее множество событий и сопрограмм. Сопрограммы необходимы, потому что в них сделано много вычислений, и я не хочу, чтобы игра зависала в это время. Теперь я начал писать модульные тесты, используя Test Runner (режим воспроизведения), а сопрограммы просто не выполняются . Поскольку мне действительно нужно быть уверенным, что они работают должным образом, невозможно просто протестировать «на более высоком уровне».
Я уже попробовал обычный метод StartCoroutine (), который не работает в тестефайл («имя метода не найдено»). Более того, я реорганизовал одну из своих сопрограмм, чтобы она стала обычным пустым методом, и все работало хорошо, и оно прошло тест. Я использовал отладчик Visual Studio, чтобы увидеть, переходит ли он в выполнение сопрограммы, и нет. Таким образом, проблема состоит в том, что сопрограммы не выполняются. Я думал о том, чтобы переместить логику вычислений в другую функцию void и протестировать эту функцию (и пропустить сопрограмму), но я должен быть уверен, что итерации, выполняемые в сопрограмме, также работают (они обычно более сложны, чем в примере).
Это минимальный пример, показывающий общую структуру (обычно выполняется гораздо больше вычислений).
public class MeasuredValues
{
List<Vector3> slidingWindow; // this is already filled when Normalize() is executed
public IEnumerator Normalize()
{
//find coordinate system origin
Vector3 originPosition = GetOrigin(); // returns a Vector3
//normalization
for (int i = 0; i < slidingWindow.Count; i++)
{
yield return null;
//reset point to be at (0,y,0)
slidingWindow[i] -= originPosition;
}
}
}
В тестовом файле я хочу:
[Test]
public void TestNormalization()
{
MeasuredValues myMeasuredValues = new MeasuredValues();
// add many Vector3 to slidingWindow
// call coroutine
// assert, that the values are now as expected
}
Я попробовал myMeasuredValues.Normalize()
(не сработало, отладчик только что перепрыгнул через него) и StartCoroutine(myMeasuredValues.Normalize)
(didnне работает, StartCoroutine не доступен в этом контексте). Наконец, я попытался
while (test.Normalize().MoveNext())
{
yield return null;
}
, но это никогда не заканчивается, поскольку для MoveNext()
никогда не устанавливается значение false. По крайней мере, отладчик подключился к методу сопрограммы.
Есть ли какое-либо легко применимое решение для тестирования моих сопрограмм с помощью Visual Studio или Unity Test Runner без необходимости рефакторинга всей структуры проекта?