我目前正在内联网上工作,其中包括创建发票。
在编写测试时,我正在使用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,因为我想测试用户如何与发票和物品表格互动。
解决此问题的最佳方法是什么?有没有更好的方法来做我想做的事情?
非常感谢提前!
答案 0 :(得分:1)
您对invoice
尚未设置的猜测是正确的。提交表单后,您可以设置它:
invoice = Invoice.last
然后你的规格应该通过。