module RSpec::Core::RSpecSet::ClassMethods

Public Instance Methods

set(variable_name, &block) click to toggle source

Set @variable_name in a before(:all) block and give access to it via let(:variable_name)

Example:

set(:transaction) { Factory(:address) }

it "should be valid" do
  transaction.should be_valid
end
# File lib/rspec-set.rb, line 18
def set(variable_name, &block)
  before(:all) do
    # Create model
    self.class.send(:class_variable_set, "@@__rspec_set_#{variable_name}".to_sym, instance_eval(&block))
  end

  before(:each) do
    model = send(variable_name)

    if model.is_a?(ActiveRecord::Base)
      if model.destroyed?
        # Reset destroyed model
        self.class.send(:class_variable_set, "@@__rspec_set_#{variable_name}".to_sym, model.class.find(model.id))
      elsif !model.new_record?
        # Reload saved model
        model.reload
      end
    else
      warn "#{variable_name} is a #{model.class} - rspec-set works with ActiveRecord models only"
    end
  end

  define_method(variable_name) do
    self.class.send(:class_variable_get, "@@__rspec_set_#{variable_name}".to_sym)
  end
end