有没有办法在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?
答案 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