让变量名称与序列

时间:2012-07-06 00:04:01

标签: ruby-on-rails rspec factory-bot

有没有办法在let变量名称中添加序列?有点像这样:

5.times do |n|
    let (:"item_'#{n}'") { FactoryGirl.create(:item, name: "Item-'#{n}'") }
end

然后像这样的测试可以起作用:

5.times do |n|
    it { should have_link("Item-'#{n}'", href: item_path("item_'#{n}'") }
end

它将导致对正确排序的测试,但只是试图理解基础知识。

编辑: 有一个错字,我删除了单引号,让调用似乎正在工作

let! (:"item_#{n}") { FactoryGirl.create(:item, name: "Item-#{n}") }

如果我使用的话,测试会通过一个案例:

it { should have_link("Item-0", href: item_path(item_0)

但是如果我使用的话,不是为了序列:

it { should have_link("Item-#{n}", href: item_path("item_#{n}")

我已经验证了问题出在href路径中。在路径中使用时如何插入item_n?

2 个答案:

答案 0 :(得分:0)

这是因为在it { should have_link("Item-#{n}", href: item_path("item_#{n}")中,href值不是字符串而是ruby变量。

我要做的是:

before do
  @items = []
  5.times do |n|
    @items << FactoryGirl.create(:item, name: "Item-#{n}")
  end
end

在规范中:

@items.each do |item|
  it { should have_link(item.name, href: item_path(item)) }
end

答案 1 :(得分:0)

使用另一个问题的答案,我发现了如何使用send从字符串中获取ruby变量的结果。另外,我喜欢Erez的答案,因为我想使用let变量,因为懒惰的评估。这就是我的工作:

describe "test" do
  5.times do |n|
    # needs to be instantiated before visiting page
    let! (:"item_#{n}") { FactoryGirl.create(:item, name: "item-#{n}") }
  end

  describe "subject" do
    before { visit items_path }

    5.times do |n|
      it { should have_link("item-#{n}", href: item_path(send("item_#{n}"))) }
    end
  end
end