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], "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], 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], 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
> > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> > >
> >
>


Reply via email to