如何在Cucumber步骤中使用minitest灯具?

时间:2013-12-06 12:38:06

标签: ruby-on-rails cucumber minitest fixtures

如何在黄瓜步骤中使用库存最小的固定装置?

说,我有`test / fixtures / users.yml:

harry:
  email: harry@hogwards.edu.uk
  password: caputdraconis

最小的,这将用于例如@user = users(:harry)。但它不能用于黄瓜:undefined method 'users' for #<Cucumber::Rails::World:0xaf2cd1c> (NoMethodError)

如何在黄瓜中使用灯具及其助手?这首先是一个好主意吗?

1 个答案:

答案 0 :(得分:1)

将其放入features/support/env.rb

module FixtureAccess
  def self.extended(base)
    ActiveRecord::FixtureSet.reset_cache
    fixtures_folder = File.join(Rails.root, 'test', 'fixtures')
    fixtures = Dir[File.join(fixtures_folder, '*.yml')].map {|f| File.basename(f, '.yml') }
    fixtures += Dir[File.join(fixtures_folder, '*.csv')].map {|f| File.basename(f, '.csv') }

    ActiveRecord::FixtureSet.create_fixtures(fixtures_folder, fixtures)    # This will populate the test database tables

    (class << base; self; end).class_eval do
      @@fixture_cache = {}
      fixtures.each do |table_name|
        table_name = table_name.to_s.tr('.', '_')
        define_method(table_name) do |*fixture_symbols|
          @@fixture_cache[table_name] ||= {}

          instances = fixture_symbols.map do |fixture_symbol|
            if fix = ActiveRecord::FixtureSet.cached_fixtures(ActiveRecord::Base.connection, table_name).first.fixtures[fixture_symbol.to_s]
              @@fixture_cache[table_name][fixture_symbol] ||= fix.find  # find model.find's the instance
            else
              raise StandardError, "No fixture with name '#{fixture_symbol}' found for table '#{table_name}'"
            end
          end
          instances.size == 1 ? instances.first : instances
        end
      end
    end
  end
end

World(FixtureAccess)

我的灯具位于test/fixtures,因为我使用的是Minitest,因此如果您使用的是RSpec,则应更新fixtures_folder以匹配灯具的位置。

在此之后,您可以执行以下操作:

When(/^a user exists$/) do
  users(:harry)
end

在步骤定义中。