【发布时间】:2013-04-13 18:24:44
【问题描述】:
我已经格式化了我的计算机,并且在重新安装 Rails 时将我的数据库更改为 postgres,现在一些之前通过的测试失败了,例如以下代码:
describe "Tickets" do
subject { page }
describe "when creating a new ticket successfully" do
before do
login_as_user
visit new_ticket_path
fill_in "Subject", with: "Test ticket"
fill_in "Description", with: "This is a test ticket"
select 'Billing', from: "ticket[category]"
click_button "Submit Ticket"
TicketNotifier.drain
Sidekiq::Extensions::DelayedMailer.drain
end
specify { last_email.to.should include("my.email@gmail.com") }
it { should have_selector('title', text: "Ticket #1") }
it { should have_content("ticket has been submitted successfully") }
end
end
返回以下错误:
10) Tickets when creating a new ticket successfully
Failure/Error: TicketNotifier.drain
ActiveRecord::RecordNotFound:
Couldn't find Ticket with id=366
# ./app/workers/ticket_notifier.rb:5:in `perform'
# ./spec/requests/blas_spec.rb:14:in `block (3 levels) in <top (required)>'
# same error repeated a few times...
或者:
context "should not be able to edit other user's website" do
before { visit edit_rental_path(1) }
it { should have_selector('title', text: "Your Websites") }
it { should have_selector(notice, text: "You do not have access to this domain.") }
end
抛出以下几个:
2) Websites create a user with 2 websites log user out log in second user should not be able to edit other user's website
Failure/Error: before { visit edit_website_path(1) }
ActiveRecord::RecordNotFound:
Couldn't find Website with id=1
# ./app/controllers/websites_controller.rb:116:in `correct_user'
# ./spec/requests/websites_spec.rb:187:in `block (6 levels) in <top (required)>'
那么,它是否为每个it { should ... } 子句创建一个新对象?
即使我尝试以下类似的方法,它也无法通过 id 找到:
@site = Website.where(link: "http://google.com").first
visit website_path(@site)
造成这些问题的原因是什么?
更新
我已按照 depa 的建议清空了我的 gemset,现在我发布的第一个测试没有出现错误,即使我指定了 it { should have_selector('title', text: "Ticket #1") }。 #1 来自票证的 ID,因此出于某种原因,它正在像以前一样进行这些测试,但除非我将它们更改为,否则我仍然会在其他人身上遇到错误:
before do
# create the ticket
@ticket = Ticket.where(...).first
end
it { should have_selector('h2', text: "Ticket ##{@ticket.id}") }
而之前,如果我将其保留为 Ticket #1,则测试将通过。 postgres 和 sqlite 作为测试数据库的工作方式是否不同?
【问题讨论】:
-
你跑
rake db:test:prepare了吗? -
是的,我也尝试过清除测试数据库并再次尝试,但没有帮助。
-
我会尝试重置您的 gem 环境,从
gem pristine rspec-rails和gem pristine capybara开始,如果您使用 RVM,则一直到rvm gemset empty。 -
检查
click_button "Submit Ticket"是否成功提交。 -
@depa 我听从了您的建议,修复了一些问题,但仍然遇到其他错误。我已经更新了我的问题。约书亚票已成功提交,请参阅更新的问题。
标签: ruby-on-rails ruby postgresql testing rspec