免责声明:我对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解释类型的方式(显然),这看起来并不像我想象的那么简单。
有没有人在类似的事情上取得成功,可以给我一个如何完成它的建议?
答案 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);
}
}
它将为您提供在错误中调用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
答案 1 :(得分:0)
您实际上是将多个测试混合到一个测试中。并且Haxe无法分辨您的数组元素的定义(行号等)
我建议将doTest
的签名更改为接受Array<Int>
而不是Array<Array<Int>>
并多次调用doTest
而不是一次。连同Justo的建议,将pos对象传递给assetEquals,您将获得正确的位置。