Hi Adam,

I have also been looking into runtime interface implementation to create
Mock objects and a basic AOP framework. I'm stuck at the exact same thing as
you are and the others that are working on this.

My guess is that we will need to have some kind of bytecode manipulation
framework to achieve this. In the Java world they use CGLib (which is based
on ASM). There already is HXASM which is a Flash9 assembler written in HaXe.
The code can easily be converted to AS3 and might suit as the basis for the
problem we are trying to solve. The problem is 1) that I don't have enough
bytecode knowledge to work on this alone and 2) that I don't know if it will
even be possible to solve the problem that way in AS3.

Don't hesitate to contact me offlist to discuss this further. I'm interested
in working on this.

Hope to keep this conversation going.

regards,
Christophe

--
Christophe Herreman
http://www.herrodius.com

2007/12/26, aduston1976 <[EMAIL PROTECTED]>:
>
>   I started a new project recently and came to a point in testing where
> I was writing a bunch of custom mock objects. Great place, I thought,
> to pick up my dream from 2.5 months ago to create a mock framework for
> flex. I tried Darron Schall's objectToInstance method, but
> unfortunately it doesn't seem to work when clazz is an Interface type
> rather than an Object type. It seems that ByteArray#readObject throws
> an exception because the interface type has no default constructor. Rats!
>
> You can see here
>
> http://thefoundry.anywebcam.com/index.php/actionscript/mock-as3-released-a-mock-object-library-for-actionscript-3/
> that some other guys have created a mock framework for as3, but they
> seem to have run into the same problem: to create a mock to pass to a
> method that expects an interface instance, you have to wrap the mock
> in a class that implements the interface. What a PITA! I am
> essentially better off hand-coding my mocks!
>
> Is there any solution to this problem? Is there any way to get the
> Flex runtime to believe that a flash.utils.Proxy subclass also
> implements a particular interface?
>
> Adam
>
>
> --- In [email protected] <flexcoders%40yahoogroups.com>,
> "aduston1976" <[EMAIL PROTECTED]> wrote:
> >
> > Bjorn, I think this is a hack but it looks like a pretty awesome hack
> > and I'm definitely going to use it. Thank you very much for posting
> > it! I think this is part of the best path to creating a mock test
> > framework for AS3. Adam
> >
> > --- In [email protected] <flexcoders%40yahoogroups.com>, Bjorn
> Schultheiss
> > <bjorn.mailinglists@> wrote:
> > >
> > > Hey Dave and Adam,
> > >
> > >
> > > That way a quick reply i sent yesterday without much thought.
> > > Currently to convert a generic object to a typed instance i've been
> > > using a utility provided by Darron Schall.
> > > http://www.darronschall.com/weblog/archives/000247.cfm
> > >
> > > basically the method looks like this,
> > >
> > > public static function objectToInstance( object:Object,
> clazz:Class ):*
> > > {
> > > var bytes:ByteArray = new ByteArray();
> > > bytes.objectEncoding = ObjectEncoding.AMF0;
> > >
> > > // Find the objects and byetArray.writeObject them, adding in the
> > > // class configuration variable name -- essentially, we're
> > > constructing
> > > // and AMF packet here that contains the class information so that
> > > // we can simplly byteArray.readObject the sucker for the
> translation
> > >
> > > // Write out the bytes of the original object
> > > var objBytes:ByteArray = new ByteArray();
> > > objBytes.objectEncoding = ObjectEncoding.AMF0;
> > > objBytes.writeObject( object );
> > >
> > > // Register all of the classes so they can be decoded via AMF
> > > var typeInfo:XML = describeType( clazz );
> > > var fullyQualifiedName:String = typeInfo.@().replace
> > > ( /::/, "." );
> > > registerClassAlias( fullyQualifiedName, clazz );
> > >
> > > // Write the new object information starting with the class
> > > information
> > > var len:int = fullyQualifiedName.length;
> > > bytes.writeByte( 0x10 ); // 0x10 is AMF0 for "typed object (class
> > > instance)"
> > > bytes.writeUTF( fullyQualifiedName );
> > > // After the class name is set up, write the rest of the object
> > > bytes.writeBytes( objBytes, 1 );
> > >
> > > // Read in the object with the class property added and return that
> > > bytes.position = 0;
> > >
> > > // This generates some ReferenceErrors of the object being passed in
> > > // has properties that aren't in the class instance, and generates
> > > TypeErrors
> > > // when property values cannot be converted to correct values
> (such
> > > as false
> > > // being the value, when it needs to be a Date instead). However,
> > > these
> > > // errors are not thrown at runtime (and only appear in trace
> ouput
> > > when
> > > // debugging), so a try/catch block isn't necessary. I'm not sure
> > > if this
> > > // classifies as a bug or not... but I wanted to explain why if
> you
> > > debug
> > > // you might seem some TypeError or ReferenceError items appear.
> > > var result:* = bytes.readObject();
> > > return result;
> > > }
> > >
> > >
> > > regards,
> > >
> > > Bjorn
> > >
> > >
> > >
> > >
> > >
> > > On 18/10/2007, at 10:40 AM, dave_defusion wrote:
> > >
> > > > Bjorn,
> > > >
> > > > I have been looking at this (as I would like a mocking framework for
> > > > Flex too) this evening and I've had no luck either.
> > > >
> > > > The the registerClassAlias() does add the alias to a given class I
> > > > can't then get anything to accept it as being of that type
> > > > - I'm not sure what the alias is, but dumping the describeType()
> > > > results shows it as an alias property on the type and not as an
> > > > implementsInterface node, which is what we need.
> > > >
> > > > I may not have been fully understood what registerClassAlias though.
> > > >
> > > > But it looks (ok, it's late and I'm tired so it may just be that
> which
> > > > is causing my negativity) as if trying to get a class to
> implement an
> > > > interface (or at least appear to implement an interface) dynamically
> > > > at run time is a futile effort.
> > > >
> > > > Any thoughts?
> > > >
> > > > -D
> > > >
> > > > --- In [email protected] <flexcoders%40yahoogroups.com>,
> Bjorn Schultheiss
> > > > <bjorn.mailinglists@> wrote:
> > > > >
> > > > > try add
> > > > > flash.net.registerClassAlias( "attempt.TestInterface",
> > > > TestInterface );
> > > > > prior to your cast attempt.
> > > > >
> > > > >
> > > > > regards,
> > > > >
> > > > > Bjorn
> > > > >
> > > > >
> > > > > On 17/10/2007, at 1:06 PM, aduston1976 wrote:
> > > > >
> > > > > > lus I see a number of places on the web where the idea is
> > > > mentioned,
> > > > > > e.g. http://www.herrodius.com/blog/?m=200704 . However I
> cannot
> > > > find
> > > > > > any mock frameworks for AS3.
> > > > > >
> > > > > > This evening I spent some time trying to mock one up on my own
> > > > (ok,
> > > > > > sorry for the pun!) but I ran into troubles. Is anyone
> > > > interested in
> > > > > > thinking about this problem with me?
> > > > > >
> > > > > > Here is what I did during my 20 minutes of playing:
> > > > > >
> > > > > > Define an interface:
> > > > > >
> > > > > > public interface TestInterface
> > > > > > {
> > > > > > function setSomething(something : String) : void;
> > > > > > }
> > > > > >
> > > > > > Run the following code:
> > > > > >
> > > > > > public function flexmock() {
> > > > > > var i : TestInterface;
> > > > > > var c : Class =
> > > > > > flash.utils.getDefinitionByName("attempt.TestInterface") as
> Class;
> > > > > > var desc : XML = flash.utils.describeType(c);
> > > > > > var str : String = desc.toString();
> > > > > > var a : Object = new Object();
> > > > > > a["setSomething"] = function(something : String) : void {
> > > > > > trace(something); };
> > > > > > // will fail on the following line, since a does not implement
> > > > > > TestInterface.
> > > > > > i = TestInterface(a);
> > > > > > i.setSomething("blah");
> > > > > > }
> > > > > >
> > > > > > AS3 doesn't support duck typing like Ruby, and I believe there
> > > > is no
> > > > > > way to get an object in memory that implements the TestInterface
> > > > > > interface that my other objects can use as a mock.
> > > > > >
> > > > > > Any thoughts about this? Am I doomed to use elbow grease or code
> > > > > > generation to create these things?
> > > > > >
> > > > > > BTW, this message is also posted on the ActionScript 3 FlexUnit
> > > > > > Library forum in Google Groups. Hopefully that isn't some
> kind of
> > > > > > forum faux pas.
> > > > > >
> > > > > > Thank you for any comments,
> > > > > > Adam
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > >
> > > >
> > > >
> > >
> >
>
>  
>



-- 
Christophe Herreman
http://www.herrodius.com
http://www.pranaframework.org

Reply via email to