Capybara用find('')检测CSS ID模型ID

时间:2012-05-08 22:20:17

标签: ruby-on-rails unit-testing rspec capybara

我目前正在内联网上工作,其中包括创建发票。

在编写测试时,我正在使用Rspec和Capybara进行测试,在运行请求测试时,我想创建一个发票并添加几个项目,以确保正确计算增值税。

但是我似乎遇到了一个问题,其中Capybara找到了第一个#item_price并试图匹配它而不是新创建的项目。

以下是我的请求测试中的一些代码。

...
...
# Laptop for 369.96 inc vat
click_link "Add Item"
fill_in "Quantity", :with => 1
fill_in "Price", :with => 369.96
fill_in "Description", :with => "laptop for 369"
click_button "Create Item"
page.should have_content("Item was successfully created")

find('#item_quantity').should have_content(1)
find('#item_price').should have_content(369.96)
find('#item_description').should have_content("laptop for 369")
find('#item_total').should have_content(369.96)

find('#invoice_subtotal').should have_content(308.30)
find('#invoice_vat').should have_content(61.66)
find('#invoice_total').should have_content(369.96)

# Laptop for 337.53 inc vat
click_link "Add Item"
fill_in "Quantity", :with => 1
fill_in "Price", :with => 337.53
fill_in "Description", :with => "laptop for 337"
click_button "Create Item"
page.should have_content("Item was successfully created")

find('#item_quantity').should have_content(1)
### the offending code below
find('#item_price').should have_content(337.53)
###
find('#item_description').should have_content("laptop for 337")
...
...

我希望能够添加#item_price_2,其中2将是商品ID。执行此操作并将find('#item_price').should have_content(337.53)更改为find('#item_price_#{invoice.id}').should have_content(337.53)时,我会收到例外情况:

Nokogiri::CSS::SyntaxError:
unexpected '#' after '[#<Nokogiri::CSS::Node:0x007f991889f270 @type=:CONDITIONAL_SELECTOR, @value=[#<Nokogiri::CSS::Node:0x007f991889f3d8 @type=:ELEMENT_NAME, @value=["*"]>, #<Nokogiri::CSS::Node:0x007f991889f9c8 @type=:ID, @value=["#item_price_"]>]>]'

同时将其更改为双引号"#item_price_{invoice.id}"会给我这个例外:

undefined local variable or method发票'#

我猜这是因为我没有使用FactoryGirl,因此invoice尚未设置为方法。我不是在这个场合使用FactoryGirl,因为我想测试用户如何与发票和物品表格互动。

解决此问题的最佳方法是什么?有没有更好的方法来做我想做的事情?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

您对invoice尚未设置的猜测是正确的。提交表单后,您可以设置它:

invoice = Invoice.last

然后你的规格应该通过。