代码之家  ›  专栏  ›  技术社区  ›  Trip

学习如何规范…似乎有困难

  •  0
  • Trip  · 技术社区  · 14 年前

    下面是我的代码:

    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\u vote存根为(:vote),它是否会通过controller方法运行并将+1归于它?

    更新

    这是我帖子里的私人方法_控制器.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
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Robert Speicher    14 年前

    很难理解你的存根到底在做什么,因为你没有发布你的代码 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

        2
  •  2
  •   Sławosz    14 年前

    我建议将逻辑从控制器移到模型。模型更易于规范,而不是:

    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

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

    如有必要。添加例外(可能是 rescue_from )

    rspec