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 回答