是否可以在Actionscript中将类型作为变量传递?

时间:2009-02-27 17:59:00

标签: flash actionscript-3 unit-testing actionscript prototype

想要写的动作脚本如下所示:

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类的情况下进行测试?我错过了一些明显的东西吗?

2 个答案:

答案 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!

}