0

この前の質問では、とユーザーのテストを作成する方法を尋ねまし。ここで、と呼ばれる3番目のモデルをテストしたいと思います。PostmodelComment

schema.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

  create_table "comments", :force => true do |t|
    t.text     "content"
    t.integer  "post_id"
    t.integer  "user_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

私は特にテストしcomments_countたい:投稿にコメントを作成したい。それらの関連付けはすでに行われています(has_manyコメントを投稿)。comments_count増加するかどうかを確認します。

誰かが私にテストがどのように見えるかの例を教えてもらえますか?

現在のコード:

comment.rb:

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id

  belongs_to :post, :counter_cache => true
  belongs_to :user
end

仕様/工場:

FactoryGirl.define do
  factory :user do
    username     "Michael Hartl"
    email    "michael@example.com"
    password "foobar"
    password_confirmation "foobar"
  end
end

FactoryGirl.define do
  factory :post do
    title     "Sample Title"
    content    "Sample Content"
    published_at Time.now()
    comments_count 0
    draft false
    association :user
  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 }

  it { should be_valid }
end

(ちなみに、私のアプリで何かをテストするのはこれが初めてです。テストする必要のないものをテストしていますか?必要なものが欠けていますか?)

4

1 に答える 1

2

コメントのためにファクトリが必要になる場合があります。

FactoryGirl.define do
  factory :comment do
    content "Sample comemnt"
    association :user
    association :post
  end
end

次のテスト(リクエストテストに入れました)は、ユーザーがフォームに何かを追加して右ボタンをクリックしたときに、コメントが実際に追加されていることを確認します。

describe "New comments" do
  let(:post) FactoryGirl.create(:post)
  let(:user) FactoryGirl.create(:user)

  context "valid with content comment added to database" do

    before do
      visit post_path(post)
      fill_in 'Content', with: "A new comment."
    end

    expect { click_button 'Create Comment' }.to change(Comment, :count).by(1)
  end
end

このテストは、コメントモデルの仕様に適している可能性があります。

describe Comment do
  let(:comment) { FactoryGirl.create(:comment) }

  subject { comment }

  it { should respond_to(:content) }
  it { should respond_to(:user_id) }
  it { should respond_to(:user) }
  it { should respond_to(:post_id) }

  it { should be_valid }

  it "should belong to a post which has a comment count of 1" do
    comment.post.comment_count.should equal 1
  end
end

このテストに合格する方法は、コメントモデルに何かを入れて、新しいコメントが作成されたときに、それが属する投稿のcomment_count属性を更新するようにすることです。

そこにある最後のテストが正しく書かれているとは100%確信していません。以前に定義した件名を上書きできるかどうかはわかりません。

于 2012-10-25T07:53:48.667 に答える