On Wed, Dec 07, 2011 at 05:06:58PM +0100, Nicola wrote:
>
> this is my first post here, so please forgive me if this is a faq. As the
> subject says, I'd like to test a participant (and, more generally, a process
> involving several participants). The only example I have found in the
> documentation (at http://ruote.rubyforge.org/testing_processes.html) involves
> undefined participants (intercepted with catchall). As soon as I modify the
> example to deal with a “real” participant, I get an error, as the following
> minimal example shows:
>
> (...)
>
> but it fails because the retrieved workitem is nil. Apparently, but not
> obviously (at least for me), I am doing something wrong. I am using Ruote
> 2.2.0
> and Ruby 1.9.2. How can the above be fixed?
Hello Nicola,
welcome to the ruote mailing list.
The participant dummy is not a storage participant so you won't find the
workitem there.
Here is a version of your test that works:
---8<---
require 'rubygems'
require 'ruote'
ENGINE = Ruote::Engine.new(Ruote::Worker.new(Ruote::HashStorage.new()))
ENGINE.register_participant :dummy0 do |workitem|
workitem.result = 10
end
ENGINE.register_participant :dummy1, Ruote::StorageParticipant
pdef = Ruote.process_definition do
dummy0
dummy1
end
wfid = ENGINE.launch(pdef)
ENGINE.wait_for(:dummy1)
workitem = ENGINE.storage_participant.first
puts workitem.result
ENGINE.storage_participant.reply(workitem)
ENGINE.wait_for(wfid)
--->8---
Here is a second version, that peeks at the result of the wait_for call:
---8<---
require 'rubygems'
require 'ruote'
ENGINE = Ruote::Engine.new(Ruote::Worker.new(Ruote::HashStorage.new()))
ENGINE.register_participant :dummy do |workitem|
workitem.result = 10
end
pdef = Ruote.process_definition do
dummy
end
wfid = ENGINE.launch(pdef)
ENGINE.storage_participant.reply(workitem)
r = ENGINE.wait_for(wfid)
p r['workitem']['fields']['__result__']
--->8---
If you want to "unit test" participants, you'd better go with something like:
---8<---
require 'ruote'
class SumParticipant
include Ruote::LocalParticipant
def consume(workitem)
items = workitem.fields['items'] || []
workitem.fields['sum'] = items.inject(0) { |s, (item, count)| s + count }
reply_to_engine(workitem)
end
def cancel(fei, flavour)
# do nothing
end
end
--->8---
and
---8<---
require 'rubygems'
require File.expand_path('../sum_participant', __FILE__)
require 'test/unit'
class SumParticipantTest < Test::Unit::TestCase
def setup
@participant = SumParticipant.new
def @participant.reply_to_engine(workitem)
$reply = workitem
end
$reply = nil
end
def new_workitem(fields={})
Ruote::Workitem.new('fields' => fields)
end
def test_sum
@participant.consume(
new_workitem('items' => [ [ 'hat', 10 ], ['car', 2 ] ]))
assert_equal 12, $reply.fields['sum']
end
def test_sum_when_no_items
@participant.consume(new_workitem)
assert_equal 0, $reply.fields['sum']
end
end
--->8---
Which directly exercises the participant's consume method.
I have to update the document at:
http://ruote.rubyforge.org/testing_participants.html
Thanks for reminding me of that TODOs.
Best regards,
--
John Mettraux - http://lambda.io/processi
--
you received this message because you are subscribed to the "ruote users" group.
to post : send email to [email protected]
to unsubscribe : send email to [email protected]
more options : http://groups.google.com/group/openwferu-users?hl=en