我想要写的动作脚本如下所示:
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类的情况下进行测试?我错过了一些明显的东西吗?
答案 0 :(得分:3)
您提供的代码中存在一些错误,但该概念在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对象中。
答案 1 :(得分:1)
查看flash.utils包。特别是,功能:getDefinitionByName()。此链接有一个很好的反射示例,您可能会喜欢。你可以尝试一下(当然,经过适当的修改):
public function API(mock:Object, type:String) {
var ClassReference:Class = getDefinitionByName(type) as Class;
var instance:Object = new ClassReference();
//instance.load(url); -- play around with your new class!
}