Skip to content

Instantly share code, notes, and snippets.

@caius
Last active December 1, 2020 13:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save caius/606b80252b176e353fe0893f8888dbbf to your computer and use it in GitHub Desktop.
Save caius/606b80252b176e353fe0893f8888dbbf to your computer and use it in GitHub Desktop.
module GivenWhenThen
module ClassMethods
def def_Given(name, *args, &block)
_gwt_define(:Given, name, *args, &block)
end
def def_When(name, *args, &block)
_gwt_define(:When, name, *args, &block)
end
def def_Then(name, *args, &block)
_gwt_define(:Then, name, *args, &block)
end
private
def _gwt_define(prefix, name, *args, &block)
define_method("#{prefix} #{name}", *args, &block)
end
end
def self.included(klass)
klass.extend(ClassMethods)
end
def Given(name, *args)
_gwt_call(:Given, name, *args)
end
def When(name, *args)
_gwt_call(:When, name, *args)
end
def Then(name, *args)
_gwt_call(:Then, name, *args)
end
def And(name, *args)
_gwt_call(:And, name, *args)
end
private
def _gwt_call(prefix, name, *args)
if prefix == :And
prefix = @_gwt_last_prefix || :Given
end
public_send("#{prefix} #{name}", *args)
ensure
@_gwt_last_prefix = prefix
end
end
RSpec.configure do |c|
c.include GivenWhenThen, type: :feature
end
@jmgarnier
Copy link

Cool implementation. I have made a change so it puts the prefix and step name:

module GivenWhenThen
  module ClassMethods
    def def_Given(name, *args, &block)
      _gwt_define(:Given, name, *args, &block)
    end

    def def_When(name, *args, &block)
      _gwt_define(:When, name, *args, &block)
    end

    def def_Then(name, *args, &block)
      _gwt_define(:Then, name, *args, &block)
    end

    private

    def _gwt_define(prefix, name, *args, &block)
      define_method("#{prefix} #{name}", *args, &block)
    end
  end

  def self.included(klass)
    klass.extend(ClassMethods)
  end

  def Given(name, *args)
    _gwt_call(:Given, name, *args)
  end

  def When(name, *args)
    _gwt_call(:When, name, *args)
  end

  def Then(name, *args)
    _gwt_call(:Then, name, *args)
  end

  def And(name, *args)
    _gwt_call(:And, name, *args)
  end

  private

  def _gwt_call(prefix, name, *args)
    if prefix == :And
      prefix = @_gwt_last_prefix || :Given
    end
    puts "  #{prefix} #{name}"
    public_send("#{prefix} #{name}", *args)

  ensure
    @_gwt_last_prefix = prefix
  end
end

RSpec.configure do |c|
  c.include GivenWhenThen
end
feature 'Feature: title example' do
  def_Given :"there is an existing thing" do
  end

  def_Given :"I am logged in as an admin" do
  end

  scenario "Scenario check a thing" do
    Given :"there is an existing thing"
    And :"I am logged in as an admin"
  end
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment