2007/9/19, Robert Krahn <rksm@gmx.net>:
Hello Denis,

I dipped into your BehaviorMockup package and it seems really powerful. I like the block notation so that the expected behavior is stated after the exercised code. This way the tests can be more uniform (Four-Phase Test) and clearer.

One thing I didn't found out is how to have the mocks ignore certain message calls.
E.g. I want this to pass:
[:mock | mock m1; m2] should lenient satisfy: [:mock | mock m1]

I tried it the 'lenient way' as above but I get a SpecFailed: WrongMessageSelector. How can one do this?

Best regards,
Robert

p.s.
I wrote this mail to the squeak-dev mailing list first but forgot to add your mail address in the header so I am writing you an extra mail.

Hi Robert.

Expression

[:mock | mock m1; m2] should lenient satisfy: [:mock | mock m1]

creates and verifies LenientBehaviorSpec. It only defines arbitrary message sends order.

If you want mock ignores any message sends you must write something like:

[:mock | mock m1; m2] should lenient satisfy: [:mock | mock anyMessage. mock m1]

But it is not implemented yet. I think it takes a few hours work..

Possible implementation:
aMessageSend selector = #anyMessage ifTrue: [
messageSendSpec := MessageSendSpec new.
messageSendSpec add: (AnyMessageSemanticsSpec from: aMessageSend).
spec add: messageSendSpec.
 ^MessageSendSpecBuilder on: messageSendSpec]
 
messageSendSpec := MessageSendSpec withMessageSemanticsLike: aMessageSend.
spec add: messageSendSpec.
 ^MessageSendSpecBuilder on: messageSendSpec

With that stuff you can write specification for ignoring any message any times:

mock anyMessage useArbitrary

And use null object (with eating message sends):

mock anyMessage
useArbitrary
willReturn: Null new

Of course you can implement some nice helper messages for it.

Sorry for my english.

Best regards,
Denis