I should add it to Mocketry.

2011/7/19 Sean P. DeNigris <sean@clipperadams.com>
Ah, so the lookups are done once when the method is compiled and then stored
in the CompiledMethod...

My vision is to write something like:
� � � �cannedNow := DateAndTime stub: #now; andReturn: [ DateAndTime year: 2011
month: 12 day: 24 hour: 12 minute: 34 second: 55 ].
� � � �testableClass := MyClass usingDouble: cannedNow.

The first line seems easy, and for the second line, I have so far (very
rough, but working):

� � � �| class copy |
� � � �class := MyClass.
� � � �copy := MyClass copy.

� � � �copy methods do: [ :m | | classRef |
� � � � � � � �(m hasLiteralSuchThat: [ :l | ((l isKindOf: Association) and: [ l key =
#DateAndTime])])
� � � � � � � � � � � �ifTrue: [ | newMeth refIndex |
� � � � � � � � � � � � � � � �newMeth := copy methodDictionary at: m selector put: m copy.
� � � � � � � � � � � � � � � �refIndex := newMeth indexOfLiteralSuchThat: [ :l | ((l isKindOf:
Association) and: [ l key = #DateAndTime])].
� � � � � � � � � � � � � � � �newMeth literalAt: refIndex put: #DateAndTime->MockedClass ] ].
� � � �^ copy.

Where CompiledMethod>>indexOfLiteralSuchThat: aBlock
� � � �"Answer the literal index of the argument, literal, or zero if none."
� � � �2 to: self numLiterals - 1 "exclude superclass + selector/properties"
� � � � � do:
� � � � � � � �[:index |
� � � � � � � �(aBlock value: (self objectAt: index)) ifTrue: [^index - 1]].
� � � �^0

Thanks again.
Sean


--
View this message in context: http://forum.world.st/Stubbing-class-side-methods-tp3674065p3676637.html
Sent from the Pharo Smalltalk mailing list archive at Nabble.com.