1

次のコントローラーアクションとテストがあります。私は Shoulda でのテストは初めてで、さらにテストできるコントローラーの領域があることを知っています。たとえば、フラッシュ メッセージやレンダリングの検証などです。

私の質問は、Shoulda でこのコントローラー アクションを適切にテストするにはどうすればよいかということです。

私のコントローラーのアクション (罪のない人を保護するために名前が変更されています):

def my_action
  return redirect_to(root_url) if @site.nil?
  @owner = current_site.owner
  if request.post?
    if params[:password].blank? || params[:email].blank?
      flash[:error] = "You must fill in both the e-mail and password fields"
      render :action => "my_action"
    else
      if @owner.authenticated?(params[:password])
        @owner.login = params[:email]
        @owner.save!
        @owner.do_some_method
        flash[:success] = "Success."
        render :action => "my_action"
      else
        flash[:error] = "Incorrect password"
        render :action => "my_action"
      end
    end      
  end  
end

私のテスト:

context "on POST to :my_action" do
  setup do
    Owner.any_instance().expects(:do_some_method)
    post :my_action, :email => 'foo@bar.com', :password => 'test'
  end
  should_assign_to :owner
  should "Change name and verify password and resend activation key" do
    assert_equal true, assigns(:owner).authenticated?('test')
    assert_equal 'foo@bar.com', assigns(:owner).login
  end
  should_respond_with :success
end
4

1 に答える 1

2

現在、コントローラー内のモデルに固有の機能をテストしているようです。これは単体テストで行う必要があります。

所有者モデル内で所有者の電子メールを更新するために必要なロジックを含めるように、コントローラーをリファクタリングすることをお勧めします。if update; else; endそうすることで、コントローラーを単純な型ステートメントにまで単純化し、コントローラーのテストを大幅に単純化できるはずです。ロジックをモデルに移動したら、組み込みの Rails 検証を使用できます。

他に考慮すべき点がいくつかあります。

  • POST アクションが完了した後にリダイレクトすると、ユーザーが誤って二重投稿するのを防ぐことができます (ユーザーが試みたときに、ほとんどのブラウザーは文句を言います)。
  • before_filtersこれがコントローラー内で複数回行われる場合は、@site のチェックと @owner への割り当てを移動します。
  • `config/routes.rb' で確認if request.post?するか、ルートを作成する必要がなくなります。verify

参考文献

于 2009-01-23T16:44:25.610 に答える