Можно ли передать тип в качестве переменной в Actionscript? - PullRequest
2 голосов
/ 27 февраля 2009

ActionScript, который я хочу написать, выглядит следующим образом:

public function API(requestClass:Type=URLLoader) {
  var req:URLLoader = new requestClass(new URLRequest("some url"));
  req.load(url);
  //etc
}

чтобы я мог протестировать класс API, передав имитируемый подкласс URLLoader. Это не представляется возможным в системе типов Actionscript.

В качестве альтернативы может быть достаточно изменить метод load () URLLoader во время выполнения. У меня были большие надежды на этот код в тестовом методе:

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 ]

3 голосов
/ 27 февраля 2009

В предоставленном вами коде есть несколько ошибок, тем не менее, эта концепция отлично работает в 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 голос
/ 27 февраля 2009

Посмотрите на пакет 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!

}
...