2017-01-09 55 views
2

免责声明:我完全陌生的HAXE,但我有许多其他语言的经验。可选的消息参数添加到的assertEquals

我有类似的测试如下:

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解释类型(显然),这看起来不像我想的那么简单。

有没有人有类似这样的,可以给我如何完成它推荐什么成功?

回答

3

如果你想只得到错误的,你可以使用haxe.PosInfos为您doTest()函数的最后一个参数的位置和arguemnt传递给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

0

您有效融合多个测试到一个单一的一个。而HAXE不能告诉您的数组元素的定义(行号等)

我的建议是要改变的doTest签名接受Array<Int>代替Array<Array<Int>>和呼叫doTest多次而不是只一次。再加上Justo的建议,将pos对象传递给assetEquals,您将正确地获得该位置。

相关问题