I tried to cover in my last post the basic guidelines I have for testing in POE. Testing in POE is different since we want to test a flow and not just subroutines. This time I want to try go over the first type of tests that I find necessary. It's called ordered tests - at least that's how I call it.
This method was first hinted at me by the great Adam Kennedy who used it in his POE::Declare module. Basically it describes the following scenario: I have a POE::Session event flow and I want to make sure that every event is run at the specific order.
package MyPackage;
use MooseX::POE;
use Test::More;
# this is taken from POE::Declare's t/04-stop.t
my $order = 0;
sub order {
my $position = shift;
my $message = shift;
is( $order++, $position, "$message ($position)" );
}
# then we can do this (written in MX::POE)
event 'eg' => sub {
order( 0, 'Started eg event' );
};
Now, each event could run this subroutine with a number indicating the order of this event in our overall flow of the session. Here, for example, with the order( 0, 'event name' ) code if any event is running at a time that wasn't meant for it, it will fail.
However, it has a few disadvantages:
order() My suggestion: allow a test that checks for event dependency. Instead of saying "this runs first", you could say "this runs ONLY after that" and "this - this runs only after these two". That would allow to have an order based on a sequence of events. Each event can only come after different events.
This is what the next post will discuss.
Single sequential run is what it's for (Score:1)
The reason I prefer my syntax to your dependency based on is that mine is easier to write and maintain, or so I find.
Of course, I completely acknowledge that it is intended for simple situations where the order is easily knowable.
Re: (Score:1)
Actually, my framework supports this specific type of tests and it looks very similar to the way you do it:
Only difference is mine is a Moose role that adds the
orderas a method of the session object. I started by implementing your method as a role and then noticed I need more options so I added more bells and whistles (which I'm now writing about).However, I'm