变量名称上带有另一个变量值,以减少重复次数

时间:2015-12-17 17:17:12

标签: ruby-on-rails ruby rspec refactoring capybara-webkit

我正在研究RSpec + capybara-webkit测试的重构,而我 我试着没有多少重复 所以我创建了这个方法,我将在测试期间多次调用:

def fill(field1, value1, field2, value2, field3, value3, button)
 fill_in field1, :with => value1
 fill_in field2, :with => value2
 fill_in field3, :with => value3
 find(button).click
end

这是我的考验:

describe "Test", :js => true do
 it "fill fields" do
  fill('first_field', 'first_value', 'second_field', 'second_value, 'third_field', 'third_value', 'input.button')
 end
end

我希望有一些非常简单的东西,比如

def fill(field1, value1, field2, value2, field3, value3, button)
 for i in 1..3 do
  fill_in field+"#{i}", :with => value+"#{i}"
 end
 find(button).click
end

但我无法轻易实现它。

我也试过

def fill(field1, value1, field2, value2, field3, value3, button)
 for i in 1..3 do
  fill_in "field#{i}", :with => "value#{i}"
 end
 find(button).click
end

RSpec会搜索名为" field1"的字段。而不是" first_field" (我传递给方法)。

3 个答案:

答案 0 :(得分:3)

您应该传递字段和值的哈希值:

def fill(button, h)
  h.each{|field, value| fill_in field, with: value}
  find(button).click
end

describe "Test", js: true do
  it "fill fields" do
    fill('input.button', 'first_field' => 'first_value', 'second_field' => 'second_value', 'third_field' => 'third_value')
  end
end

答案 1 :(得分:1)

这是一个适用于任何 n 字段和值对的解决方案:

def fill(fields, values, button)
    (fields.zip values).each { |field, value| fill_in field, :with => value }
    find(button).click
end

电话有点不同:

fill(['first_field', 'second_field', 'thrid_field'], ['first_value', 'second_value', 'third_value'], 'input.button')

答案 2 :(得分:-1)

(1..3).each do |i|
  fill_in eval("field#{i}"), with: eval("value#{1}")
end