0

ここに私が仕様している私のコードがあります:

def vote_up
  get_vote
  @vote.value += 1 unless @vote.value == 1
  @vote.save
  respond_to do |format|
    format.js { render :action => "vote", :layout => false }
  end
end

かなり簡単に思えます。これは私がそれを仕様しようとしているものです:

  it "should vote up" do
    @mock_cat = Factory.create(:category)
    Category.stub(:mock_cat)
    @mock_post = Factory.create(:post)
    Post.stub(:current_post).and_return(@mock_post)

    @vote = Factory(:vote)

    get :vote_up, :id => @vote
    @vote.reload.value.should == 1    
  end

これを返しています:

undefined method `to_i' for #<Vote:0x1052a4af8>

理由はよくわかりませんが。mock_vote を (:vote) としてスタブ化した場合、それはコントローラー メソッドを介して実行され、それに起因する +1 を取得しませんか?

アップデート

これが私の posts_controller.rb のプライベート メソッドです。

private

def get_vote
  current_post = Post.all.detect{|r| r.id == params[:id].to_i}
  @post = current_post
  @vote = current_post.votes.find_by_user_id(current_user.id)
  unless @vote
    @vote = Vote.create(:user_id => current_user.id, :value => 0)
    current_post.votes << @vote
  end
end

答え:

  it "should vote up" do
    @mock_cat = Factory.create(:category)
    Category.stub(:mock_cat)
    @post = Factory(:post)

    get :vote_up, :id => @post.id
    @post.reload.vote_score.should == 1    
  end
4

2 に答える 2

2

ロジックをコントローラーからモデルに移動することをお勧めします。モデルの仕様ははるかに簡単です。それ以外の:

def vote_up
  get_vote
  @vote.value += 1 unless @vote.value == 1
  @vote.save
  respond_to do |format|
    format.js { render :action => "vote", :layout => false }
  end
end

コントローラは次のようになります。

def vote_up
  @vote = Vote.vote_up(params[:id])
  respond_to do |format|
    format.js { render :action => "vote", :layout => false }
  end
end

または、本当に必要な場合get_vote(before_filterに移動する必要があるかもしれませんか?)

def vote_up
  @vote.vote_up
  respond_to do |format|
    format.js { render :action => "vote", :layout => false }
  end
end

必要ならば。例外を追加します(rescue_fromを使用する場合があります)

次に、モデル内の仕様といくつかの統合( rspec、steac、cucumber)のみが必要になります。

于 2010-09-15T07:41:02.957 に答える
1

のコードを投稿していないため、スタブが何をしているかを正確に追跡するのは困難ですget_vote。しかし、すでに作成しているファクトリを利用できるのに、スタブを使いすぎていると思います。

it "should vote up" do
  # Does your Vote belong to a post or a category or anything? I don't know. 
  # Modify as needed -- Factory(:vote, :post => Factory(:post))
  @vote = Factory(:vote) 

  get :vote_up, :id => @vote
  @vote.reload.value.should == 1
end

に注意してくださいreload。コントローラーは、データベースから既に取得したレコードを変更しているため、新しい値を確認するために再読み込みする必要があります。

于 2010-09-15T02:37:26.120 に答える