我想要编写的 ActionScript 如下所示:
public function API(requestClass:Type=URLLoader) {
var req:URLLoader = new requestClass(new URLRequest("some url"));
req.load(url);
//etc
}
这样我就可以通过传入 URLLoader 的模拟子类来测试 API 类。这在 Actionscript 的类型系统中似乎是不可能的。
或者,在运行时更改 URLLoader 的 load() 方法就足够了。我对测试方法中的这段代码寄予厚望:
var b:Array = [];
URLLoader.prototype.load = function(u:URLRequest):void {
b.push(u);
}
(new URLLoader()).load(new URLRequest("http://localhost"));
assertEquals(b.length, 1);
但 URLLoader 实际上调用了它给定的 url,并且 b.length == 0。
那么!有没有什么方法可以将我的 API 类编写为可测试的,而无需将测试逻辑放入我的 API 类中?我错过了一些明显的事情吗?
最佳答案
您提供的代码中有一些错误,但该概念在 AS3 中完美运行。例如,以下代码可以完美编译并运行:
package {
import flash.display.Sprite;
public class Main extends Sprite {
public function Main():void {
trace(getDynObj());
trace(getDynObj(Number));
trace(getDynObj(String));
}
public function getDynObj(requestClass:Class = null):* {
var req:* = new (requestClass || int)("16.51");
return req;
}
}
}
和输出:
16
16.51
16.51
因此,您的函数需要进行以下修改:
public function API(requestClass:Class = null):void {
var req:* = new (requestClass || URLLoader)(new URLRequest("some url"));
//etc
}
注意: URLLoader 不接受纯字符串作为其构造函数参数,您必须将该字符串包装在 URLRequest 对象中。
关于flash - 是否可以在 Actionscript 中将类型作为变量传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/595868/