0

我想使用RspecCapybara编写测试。

我有一个Post模型,我想给draft它添加一个属性。如果用户选中该字段,则帖子将保存为草稿 ( draft = true)。只有具有 he 属性draft = false的帖子才会显示在帖子索引页面中。带有的帖子draft = true只会显示在创建该帖子的用户的页面中。

我这辈子从来没有做过Rspec + Capybara测试。所以我想知道是否有人可以告诉我如何开始或给我一个例子。提前致谢!

架构.rb:

 create_table "posts", :force => true do |t|
    t.string   "title"
    t.string   "content"
    t.integer  "user_id"
    t.datetime "created_at",                               :null => false
    t.datetime "updated_at",                               :null => false
    t.integer  "comments_count",        :default => 0,     :null => false
    t.datetime "published_at"
    t.boolean  "draft",                 :default => false
  end

(顺便问一下,我需要发布模型、控制器或视图页面吗?)

4

2 回答 2

2

要添加到 new2ruby 的答案,您还可以在集成测试中使用 capybara 提供的功能/场景别名。

我觉得它读起来很好:

require 'spec_helper'

feature 'Visitor views posts' do
    scenario 'shows completed posts' do 
        post = FactoryGirl.create(post)
        visit posts_path

        page.should have_content(post.title)
    end

    scenario 'does not show drafts' do
        draft = FactoryGirl.create(draft)
        visit posts_path

        page.should_not have_content(draft.title)
    end
end

我最近写了一篇关于使用RSpec 和 Capybara 进行集成测试的“入门”博客文章。如果您对设置代码库有任何疑问,请告诉我。

于 2012-10-24T13:42:50.190 回答
1

我一直在遵循模型测试和集成测试的基本模式。我也一直在使用 FactoryGirl 以及 rspec 和 capybara。所以...首先是我的工厂的样子:

FactoryGirl.define do
  factory :user do
    sequence(:email) { |n| "person#{n}@example.com" }
    password "foobar"
    password_confirmation "foobar"
  end

  factory :post do
    sequence(:title) { |n| "Test Title #{n}"}
    string "Test content."
    published_at Time.now()
    comments_count 0
    draft false
    association :user

    factory (:draft) do
      draft true
    end
  end
end

然后我会制作一个模型规格文件(spec/models/post_spec.rb):

require 'spec_helper'

describe Post do
  let(:post) { FactoryGirl.create(:post) }

  subject { post }

  it { should respond_to(:title) }
  it { should respond_to(:content) }
  it { should respond_to(:user_id) }
  it { should respond_to(:user) }
  it { should respond_to(:published_at) }
  it { should respond_to(:draft) }
  it { should respond_to(:comments_count) }

  its(:draft) { should == false }
  its(:comments_count) { should == false }

  it { should be_valid }
end

然后我会做一个集成测试(spec/requests/posts_spec.rb):

require 'spec_helper'

describe "Posts pages" do

  subject { page }

  describe "index page when draft == false" do
    let(:post)  { FactoryGirl.create(:post) }

    before { visit posts_path }

    it { should have_content(post.title) }
  end

  describe "index page when draft == true" do
    let(:draft) { FactoryGirl.create(:draft) }

    before { visit posts_path }

    it { should_not have_content(draft.title) }
  end
end

您可以尝试通过http://ruby.railstutorial.org/上的 Rails 教程进行操作,它使用 rspec、capybara 和 FactoryGirl 进行测试。

于 2012-10-24T05:33:51.157 回答