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 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >

