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.