On 19 July 2011 01:02, Sean P. DeNigris <[email protected]> wrote: > 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 >
you doing something really complex. on your place i would just implement #dateAndTimeClass so, you can just write self dateAndTimeClass new and depending on implementor it would answer one or another class. > 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. > > -- Best regards, Igor Stasenko AKA sig.
