Отказ от ответственности: я новичок в 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
jwir3 10 Янв 2017 в 02:13

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

3
Justo Delgado 10 Янв 2017 в 03:08

Вы эффективно объединяете несколько тестов в один. И Haxe не может сказать, где определен ваш элемент массива (номер строки и т. Д.).

Я предлагаю изменить подпись doTest, чтобы принимать Array<Int> вместо Array<Array<Int>> и вызывать doTest несколько раз, а не один раз. Вместе с предложением Джусто, передав объект pos в assetEquals, вы получите правильную позицию.

0
KevinResoL 11 Янв 2017 в 04:42