我正在编写我的第一个Rails应用程序,这个问题困扰了我几天。我正在使用Michael Hartl的Ruby on Rails教程作为指导,因此我正在使用RSpec和Capybara来编写测试。
我为Rink对象和Rating对象创建了模型。用户应该能够为溜冰场创建评级。我编写了一个测试,用于检查当用户输入有效信息以创建评级时是否创建评级。创建有效评级的一部分是通过选择框选择评级连接的Rink。选择框中填充了数据库中的Rinks。
require 'spec_helper'
describe "RatingPages" do
subject { page }
describe "rating creation" do
before { visit new_rating_path }
let(:submit) { "Rate it!" }
describe "with valid information" do
let(:rink) { FactoryGirl.create(:rink) }
before do
select("Victoria Park", :from => 'rating[rink_id]')
fill_in "ice", with: "4"
fill_in "players", with: "10"
fill_in "comment", with: "Great ice!"
end
it "should create a rating" do
expect { click_button submit }.to change(Rating, :count).by(1)
end
end
end
end
因为创建评级取决于是否存在Rink,我的测试使用FactoryGirl在测试数据库中创建Rink。
FactoryGirl.define do
factory :rink do
name "Victoria Park"
address "516 King Street West"
end
当我运行此测试时,我收到一条错误,指出Capybara找不到我的测试中创建的Rink。
2)使用有效信息创建RatingPages评级应创建用户 失败/错误:选择(“Victoria Park”,:from =>'rating [rink_id]') 水豚:: ElementNotFound: 无法找到选项“维多利亚公园” './spec/requests/rating_pages_spec.rb:28:in'块(4级)in'
以下是我到目前为止所尝试的内容:我使用控制台在开发数据库中手动创建了一个Rink,并通过了测试。我也确认我的工厂正在成功创建一个溜冰场。
所以我认为问题在于,当我运行测试时,选择框是从开发数据库而不是测试数据库中绘制的。因此,我使用工厂创建的Rink显示在测试数据库中,但不在选择框中显示为其中一个选项。
我认为我很有可能以错误的方式编写此测试,但我无法从Google搜索中找到任何帮助。有人能指出我正确的方向吗?
谢谢!
编辑 - 以下是生成选择框的视图代码:
<% provide(:title, "New Rating") %>
<h1>Post a new rating</h1>
<%= form_for(@rating) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label "Select a rink:" %>
<%= f.collection_select(:rink_id, Rink.all, :id, :name, prompt: 'Select a rink') %>
<%= f.label "Rate the ice quality." %>
<%= f.select :ice, [['Great!', 4], ['Fair', 3], ['Poor', 2], ['Unskateable', 1]] %>
<%= f.label "How many people are playing hockey?" %>
<%= f.text_field :players %>
<%= f.label :comment %>
<%= f.text_area :comment%>
<%= f.submit "Rate it!" %>
<% end %>
答案 0 :(得分:0)
使用时:
let(:rink) { FactoryGirl.create(:rink) }
在测试期间调用rink
之前,它实际上不会创建Rink模型。由于您没有调用rink
,因此永远不会创建模型。
如果您将其更改为:
let!(:rink) { FactoryGirl.create(:rink) }
(注意let!
之后的爆炸声),它会立即创建模型并以您的形式提供。