I had this problem. I tried something like (though not exactly w/ this code):
Foo stub new will: [ :aMessage |
�� | original |
�� original := MockExpectedOriginalCall new executeFor: aMessage.
�� original stub.
�� ^ original ]
but IIRC it failed on doing #stub inside will: block.
Foo stub new willStubRealResult.
MockExpectedMethodResultStub>>executeFor: anOccurredMessagerealMethodResult := super executeFor: anOccurredMessage.realMethodResult stub.^realMethodResult.
MockExpectedMessage>>willStubRealResult
self will: MockExpectedMethodResultStub new
And you will be able assert any message which was sent to Foo instances:(Instance of: Foo) stub someMessage willReturn: #const
(Instance of: Foo) should receive someRequiredMessage which should equal: #expectedValue
So now you can just use simple mock which will be returned as simple
stub from concrete constructor of your class:
�� �� some := Mock new.
�� �� some stub askForName: 'new'.
�� �� Something stub new willReturn: some.
I think it looks not not bad and no crazy magic is evolved. And of
course you can replace mock with real instance if you want:
�� �� some := Something new.
�� �� some stub askForName: 'new'.
�� �� Something stub new willReturn: some.
2017-10-20 14:21 GMT+02:00 Denis Kudriashov <dionisiydk@gmail.com
<mailto:dionisiydk@gmail.com>>:
�� �� Yes, but in that case you stub messages to the class itself. For
�� �� your example it means:
�� �� �� �� Something stub askForName willReturn: 'new'.
�� �� Something askForName should be: 'new'
�� �� 2017-10-20 13:58 GMT+02:00 Peter Uhn��k <i.uhnak@gmail.com
�� �� <mailto:i.uhnak@gmail.com>>:
�� �� �� �� Thanks Denis, that did the trick.
�� �� �� �� But I thought that I can also mock at the class level (at least
�� �� �� �� it was shown in the docs).
�� �� �� �� Peter
�� �� �� �� On Sat, Oct 7, 2017 at 11:24 AM, Denis Kudriashov
�� �� �� �� <dionisiydk@gmail.com <mailto:dionisiydk@gmail.com>> wrote:
�� �� �� �� �� �� Hi Peter.
�� �� �� �� �� �� You should stub instance instead of class:
�� �� �� �� �� �� �� �� �� s := Something new.
�� �� �� �� �� �� �� �� �� s stub askFor...
�� �� �� �� �� �� 7 ������. 2017 ��. 9:18 ������������������������ "Peter Uhn��k"
�� �� �� �� �� �� <i.uhnak@gmail.com <mailto:i.uhnak@gmail.com>> ��������������:
�� �� �� �� �� �� �� �� Hi,
�� �� �� �� �� �� �� �� maybe I am missing something fundamental, because this
�� �� �� �� �� �� �� �� seems like an obvious scenario
�� �� �� �� �� �� �� �� I have a class Something with two methods
�� �� �� �� �� �� �� �� Something>>askForName
�� �� �� �� �� �� �� �� ^ UIManager default request: 'Name'
�� �� �� �� �� �� �� �� Something>>name
�� �� �� �� �� �� �� �� ^ self askForName , ' suffix'
�� �� �� �� �� �� �� �� Now I want to mock out askForName, so I can run it
�� �� �� �� �� �� �� �� automatically in tests...
�� �� �� �� �� �� �� �� I've tried just stubbing it...
�� �� �� �� �� �� �� �� SomethingTest>>testRenameStub
�� �� �� �� �� �� �� �� Something stub askForName willReturn: 'new'.
�� �� �� �� �� �� �� �� Something new name should be: 'new suffix'
�� �� �� �� �� �� �� �� however it still opens the window to ask for the name,
�� �� �� �� �� �� �� �� so the original method is being called.
�� �� �� �� �� �� �� �� Right now I have to stub it with metalinks, which
�� �� �� �� �� �� �� �� doesn't play well with some tools (hapao)
�� �� �� �� �� �� �� �� SomethingTest>>testRenameMeta
�� �� �� �� �� �� �� �� | link newName |
�� �� �� �� �� �� �� �� link := MetaLink new
�� �� �� �� �� �� �� �� metaObject: [ 'new' ];
�� �� �� �� �� �� �� �� control: #instead.
�� �� �� �� �� �� �� �� (Something >> #askForName) ast link: link.
�� �� �� �� �� �� �� �� [ newName := Something new name ]
�� �� �� �� �� �� �� �� ensure: [ link uninstall ].
�� �� �� �� �� �� �� �� self assert: newName equals: 'new suffix'
�� �� �� �� �� �� �� �� Thanks,
�� �� �� �� �� �� �� �� Peter