2017-10-10 45 views
1

私はRspecを初めて使用しています。基本的な機能のコントローラメソッドをテストしようとしています。私は基本的な機能をテストするつもりはないと知っていますが、私は何かを構築するよりも学習目的のためにもっとや​​っています。Rspec投稿: 'unknown keyword:'を作成する

私はProtocolsControllerというコントローラを持っています。コントローラは、基本的なCRUD機能に使用されます。コントローラをテストして#メソッドを作成しようとしています。以下は私の#createコントローラです:

def create 
    @protocol = Protocol.new(protocol_params) 

    if @protocol.save 
     flash[:notice] = 'New protocol added' 
     redirect_back(fallback_location: 'test_results#index') 
    else 
     flash[:notice] = @protocol.errors[:name] 
     render 'new' 
    end 
    end 

悲しいパスをテストするために、私は、コントローラにプロトコルクラスのインスタンスを作成するために必要なパラメータが含まれていますモックオブジェクトを渡したいです。これを行うために、私は次のコードを持っている:

describe '#create' do 
    it 'fails to save because the name already exists' do 
     params = FactoryGirl.attributes_for(:protocol) 
     post :create, :protocol => params 
    end 
    end 

は今、私はテストが完了していないけど、私は、一度に1つのラインをテストしていると私はRSpecのを実行すると、私は次のエラーを取得する:

Failure/Error: post :create, :protocol => params 

    ArgumentError: 
     unknown keyword: protocol 

しかし私は投稿を変更するとき:expect { post :create, :protocol => params }

それは働く。私の質問に私をもたらします:

  • 最初の投稿(post :create, :protocol => params)はなぜ失敗しますか?
  • モックオブジェクトをコントローラに送信するにはどうすればよいですか?
  • expectバージョンはなぜ機能しますか?

質問に対する洞察は非常に高く評価されます。私はこれを理解しようとしている私の頭を傷つけてきた、そして、私の推測はそれが明らかな答えだということです。

+0

使用しているRSpecのバージョンは何ですか? –

+1

最新バージョン - > 3.6 – Darkisa

答えて

4

あなたがRailsの中でもう動作しませんpostを呼び出している方法は、5

これは、以前のバージョンの廃止の警告は、次のとおりです。

ActionController::TestCase HTTP request methods will accept only keyword arguments in future Rails versions.

は今、あなたは持っているように、paramsキーを追加しますこの:post :create, :params => { :protocol => params }が同じことを意味していること

post :create, params: { protocol: params }

お知らせ、それはですちょうど別の構文です。

+0

あなたは素晴らしいです!これありがとう。魅力のように動作します。私は何が間違っているのだろうと思っていた。再度、感謝します。 – Darkisa

関連する問題