2017-10-10 102 views
1

我是新來的Rspec,我想測試我的控制器方法的基本功能。我知道我不應該測試基本功能,但是我爲了學習的目的而不是創建一些東西。Rspec後:創建'未知的關鍵字:'

我有一個名爲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 

現在我知道測試是不完整的,但我在一次測試一條線,當我運行Rspec的,我得到以下錯誤:

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

    ArgumentError: 
     unknown keyword: protocol 

但是,當我改變後:expect { post :create, :protocol => params }

它的工作。這讓我想起我的問題:

  • 爲什麼第一篇文章(post :create, :protocol => params)失敗?
  • 我該如何去發送模擬對象到控制器?
  • 爲什麼預期版本有效?

任何洞察到的問題將不勝感激。我一直在摸索着解決這個問題,我的猜測是這是一個明顯的答案。

+0

您使用的是哪種版本的RSpec? –

+1

最新版本 - > 3.6 – Darkisa

回答

4

你打電話post不會再Rails的工作方式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