Cucumber: The Mysteries of Before(), After(), World() etc


#1

My use case is that I want to be able to use a Logging::Logger[1]
within my scenario code.

I can create the logger explicitly within the step block, but this is
a hackaround.

I think I could monkey-patch Cucumber::Rails::World to include my
logger, but that also feels dirty.

Is there a nice clean way I can use on of the above (AFAIK
undocumented) methods to help me?

Better, is there some documentation / a blog post I can be pointed to
so I can help myself? I have had a pretty thorough read of the code
but I’m not quite there yet with my Ruby to make sufficient sense of it.

cheers,
Matt


#2

On Wed, Nov 12, 2008 at 2:12 PM, Matt W. removed_email_address@domain.invalid wrote:

methods to help me?

Try this:

World do
world = Object.new
world.extend(Logging::Logger)
world
end

Aslak


#3

On Wed, Nov 12, 2008 at 7:30 AM, aslak hellesoy
removed_email_address@domain.invalid wrote:

Is there a nice clean way I can use on of the above (AFAIK undocumented)
methods to help me?

Try this:

World do
world = Object.new
world.extend(Logging::Logger)
world
end

Or, since you’re using Rails here:

World do
returning Cucumber::Rails::World do |world|
world.extend(Logging::Logger)
end
end

David


#4

On Wed, Nov 12, 2008 at 8:59 AM, David C. removed_email_address@domain.invalid
wrote:

world.extend(Logging::Logger)
end
end

It would be really nice to be able to do:

World do |world|
returning world do |w|
w.extend(Logging::Logger)
end
end

This way steps files could extend the world by adding to a chain,
agnostic of the nature of the original world object.

Peter


#5

On Thu, Nov 13, 2008 at 8:59 AM, Peter J. removed_email_address@domain.invalid
wrote:

returning Cucumber::Rails::World do |world|
end

This way steps files could extend the world by adding to a chain,
agnostic of the nature of the original world object.

That’s a cool idea - can you put a feature request in lighthouse?

http://rspec.lighthouseapp.com/projects/16211-cucumber/overview

Cheers,
David


#6

On 13 Nov 2008, at 15:01, David C. wrote:

end
returning world do |w|

Cheers,
David

That’s how I’d originally expected it to work, TBH. When I looked at
the source and it didn’t, I got scared :slight_smile:

cheers,
Matt


#7

On Thu, Nov 13, 2008 at 3:59 PM, Peter J. removed_email_address@domain.invalid
wrote:

returning Cucumber::Rails::World do |world|
end

This way steps files could extend the world by adding to a chain,
agnostic of the nature of the original world object.

You may want to be in control over the world type (class). For
example, in Rails the world instance is a
ActionController::Integration::Session instance (off the top of my
head) and in vanilla Cucumber it is Object. what if you want to change
that?

Maybe Cucumber could send in a world instance it thinks is the one
you want (allowing what you suggest (and allow the user to instantiate
a different class if they want to).

I’m happy with the suggested type

World do |world|
returning world do |w|
w.extend(Logging::Logger)
end
end

I want my own type!

World do
world = MyType.new
returning world do |w|
w.extend(Logging::Logger)
end
end

I didn’t see a ticket yet, so please add my comment or link to mail
archive for this thread when you create the ticket.

Cheers,
Aslak


#8

On Thu, Nov 13, 2008 at 10:01 AM, David C. removed_email_address@domain.invalid
wrote:

That’s a cool idea - can you put a feature request in lighthouse?

Done:
http://rspec.lighthouseapp.com/projects/16211-cucumber/tickets/87-yield-existing-world-object-to-world-block

Peter