Отказ от ответственности: я новичок в Haxe, но у меня есть опыт работы на многих других языках.
У меня есть тесты, похожие на следующие:
function doTest(type:SomethingMagic, tests:Array<Array<Int>>) {
for (t in tests) {
var res = DoSomeMagicalWork(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7]);
assertEquals(type, res.type);
}
}
Проблема в том, что среда модульного тестирования при запуске на множестве разных массивов не дает мне правильной строки, для которой тест не удался. Другими словами, если я запускаю этот метод с кучей массивов, например:
doTest(SOME_MAGIC_TYPE,
[[0, 0, 0, 1625, 0, 35, 0, 0, 0, 0, 0],
...
]);
И одна из этих строк не работает, она не сообщает мне, какая строка завершилась ошибкой. Теперь я знаю, что, возможно, в любом случае я мог бы реструктурировать эти тесты, чтобы они были немного более интуитивно понятными, но это было написано кем-то другим, и у меня нет возможности изменить каждый из них в данный момент.
Я бы хотел сделать следующее:
function doTest(type:SomethingMagic, tests:Array<Array<Int>>) {
var number = 0;
for (t in tests) {
var res = DoSomeMagicalWork(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7]);
assertEquals(type, res.type, "Test #" + number + " for type " + type);
number++;
}
}
Итак, по сути, я хотел бы иметь возможность передавать некоторую дополнительную информацию об обмене сообщениями в функцию assertEquals
, подобно тому, как это можно сделать в других средах модульного тестирования. Затем, в случае сбоя, он выводит стандартное сообщение с утверждением, возможно, добавленное дополнительным сообщением, которое я отправил в качестве параметра функции. Первоначально я думал, что это так же просто, как подклассы haxe.TestCase
, но это оказалось не так просто, как я думал, из-за того, как Haxe интерпретирует типы (очевидно).
У кого-нибудь был успех с чем-то похожим на это, что могло бы дать мне рекомендацию о том, как это сделать?
2 ответа
Если вы хотите получить только позицию ошибки, вы можете использовать haxe.PosInfos
в качестве последнего аргумента вашей функции doTest()
и передайте этот аргумент assertEquals()
следующим образом:
import haxe.unit.TestCase;
class Main {
static function main() {
var r = new haxe.unit.TestRunner();
r.add(new Test());
r.run();
}
}
class Test extends TestCase {
public function new() {
super();
}
public function testExample() {
doTest(1, 1);
doTest(1, 2);
doTest(3, 3);
}
function doTest(a:Int, b:Int, ?pos:haxe.PosInfos) {
assertEquals(a, b, pos);
}
}
Это даст вам позицию, которая вызвала doTest()
в ошибке:
Test::testExample() ERR: Main.hx:18(Test.testExample) - expected '1' but was '2'
Другой вариант, если вы хотите добавить собственное сообщение, - это перехватить ошибку assertEquals()
и повторно выбросить currentTest
со специальной ошибкой, подобной этой:
import haxe.unit.TestCase;
class Main {
static function main() {
var r = new haxe.unit.TestRunner();
r.add(new Test());
r.run();
}
}
class Test extends TestCase {
public function new() {
super();
}
public function testExample() {
doTest(1, 1, "Error on test 1");
doTest(1, 2, "Error on test 2");
doTest(3, 3, "Error on test 3");
}
function doTest(a:Int, b:Int, errorMsg:String, ?pos:haxe.PosInfos) {
try {
assertEquals(a, b, pos);
} catch(e:Dynamic) {
currentTest.error = errorMsg;
throw currentTest;
}
}
}
Это даст вам следующую ошибку:
Test::testExample() ERR: Main.hx:18(Test.testExample) - Error on test 2
Вы эффективно объединяете несколько тестов в один. И Haxe не может сказать, где определен ваш элемент массива (номер строки и т. Д.).
Я предлагаю изменить подпись doTest
, чтобы принимать Array<Int>
вместо Array<Array<Int>>
и вызывать doTest
несколько раз, а не один раз. Вместе с предложением Джусто, передав объект pos в assetEquals, вы получите правильную позицию.
Похожие вопросы
Новые вопросы
unit-testing
Модульное тестирование - это метод, с помощью которого отдельные блоки исходного кода тестируются, чтобы определить, пригодны ли они для использования.