Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 变量名上有另一个变量值,以减少重复_Ruby On Rails_Ruby_Rspec_Refactoring_Capybara Webkit - Fatal编程技术网

Ruby on rails 变量名上有另一个变量值,以减少重复

Ruby on rails 变量名上有另一个变量值,以减少重复,ruby-on-rails,ruby,rspec,refactoring,capybara-webkit,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(

我正在进行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的字段,而不是我传递给该方法的第一个字段。

以下是一个适用于任意n对字段和值的解决方案:

(1..3).each do |i|
  fill_in eval("field#{i}"), with: eval("value#{1}")
end
def fill(fields, values, button)
    (fields.zip values).each { |field, value| fill_in field, :with => value }
    find(button).click
end
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
电话有点不同:

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

您应该传递字段和值的散列:

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

正如我在问题中所说的,我尝试过类似的方法,但它会查找一个名为field1的字段,它不是我正在查找的for@fabersky这个答案与您尝试的不同。evalfield{i}的计算值是first_字段,依此类推。@sawa我不关心下行投票;尽管如此,还是要感谢投票。在测试中害怕eval简直是疯了。不必要地使用eval来解决这个问题也同样疯了。@meagar假设你是主持人,你可能能够阅读问题标题,这显然是“变量名上有另一个变量值,以减少重复次数。”经过投票和选择的答案都表明了不同的方法,我的方法解决了标题中所述的问题。无论你是否认为回答他们所说的问题是“不必要的疯狂”,我对这个话题保留自己的观点。我认为没有理由使用Hash[]和每个。您可以直接将块传递给zip。谢谢@sawa,我更新了答案以避免使用哈希。我不明白你所说的“没有理由使用每一个”是什么意思,你能详细说明一下你的想法吗?