将可选消息参数添加到assertEquals

时间:2017-01-09 23:13:03

标签: unit-testing haxe

免责声明:我对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 个答案:

答案 0 :(得分:3)

如果您只想获取错误的位置,可以使用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);
    }
}

Online example here

它将为您提供在错误中调用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;
        }

    }
}

Online example here

哪会出现以下错误:

Test::testExample() ERR: Main.hx:18(Test.testExample) - Error on test 2

答案 1 :(得分:0)

您实际上是将多个测试混合到一个测试中。并且Haxe无法分辨您的数组元素的定义(行号等)

我建议将doTest的签名更改为接受Array<Int>而不是Array<Array<Int>>并多次调用doTest而不是一次。连同Justo的建议,将pos对象传递给assetEquals,您将获得正确的位置。