1

有没有办法给 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 调用似乎正在工作

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?

4

2 回答 2

1

使用另一个问题的答案,我发现了如何从字符串中获取 ruby​​ 变量的结果,使用send. 另外,我确实喜欢 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
于 2012-08-26T01:25:50.350 回答
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
于 2012-07-13T06:42:41.410 回答