是否应该从我应用的测试数据库中填充选择框?

时间:2014-04-19 16:17:25

标签: ruby-on-rails

我正在编写我的第一个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 %>

1 个答案:

答案 0 :(得分:0)

使用时:

let(:rink) { FactoryGirl.create(:rink) }

在测试期间调用rink之前,它实际上不会创建Rink模型。由于您没有调用rink,因此永远不会创建模型。

如果您将其更改为:

let!(:rink) { FactoryGirl.create(:rink) }

(注意let!之后的爆炸声),它会立即创建模型并以您的形式提供。