2016-11-18 5 views
0

モックとスタブでテストしていますが、コントローラーでcreateアクションをテストするときに必要な出力が得られません。テスト時に正確な出力が得られないRSpecでアクションを作成する

失敗テスト:

describe 'authenticated user' do 
    let(:user) { instance_double(User) } 
    before do 
    allow(controller).to receive(:current_user) { user } 
    allow(controller).to receive(:authenticate_user!) { true } 
    end 

    describe "POST create" do 
    let(:achievement_params) { { title: "title" } } 
    let(:create_achievement) { instance_double(CreateAchievement) } 

    before do 
     allow(CreateAchievement).to receive(:new) { create_achievement } 
    end 

    it 'sends create message to CreateAchievement' do 
    expect(CreateAchievement).to receive(:new).with(achievement_params, user) 
    expect(create_achievement).to receive(:create) 
    post :create, achievement: achievement_params 

    end 
    end 
end 

コントローラでcreateアクション

def create 
    service = CreateAchievement.new(params[:achievement], current_user) 
    service.create 
    render nothing: true 
end 

エラー:

1) AchievementsController authenticated user POST create sends create message to CreateAchivement 
Failure/Error: expect(CreateAchievement).to receive(:new).with(achievement_params, user) 

    #<CreateAchievement (class)> received :new with unexpected arguments 
    expected: ({:title=>"title"}, #<InstanceDouble(User) (anonymous)>) 
      got: (<ActionController::Parameters {"title"=>"title"} permitted: false>, #<InstanceDouble(User) (anonymous)>) 
    Diff: 
    @@ -1,2 +1,3 @@ 
    -[{:title=>"title"}, #<InstanceDouble(User) (anonymous)>] 
    +[<ActionController::Parameters {"title"=>"title"} permitted: false>, 
    + #<InstanceDouble(User) (anonymous)>] 

答えて

0

あなたが "許可" あなたのPOST値する必要があるためです、あなたのコントローラで:

def achievement_params 
    params.require(:achievement).permit(:title) 
end 

してから、お使いのコントローラのアクションからそれを呼び出す:

service = CreateAchievement.new(achievement_params, current_user) 
0

あなたのコントローラ内のパラメータ許可する必要があります。

private 

def achievement_params 
    params.require(:achievement).permit(:title) 
end 
は論文paramsはを受け取るためにあなたの作成方法を変更

、代わりにparams[:achievement]

def create 
    service = CreateAchievement.new(achievement_params, current_user) 
    service.create 
    render body: nil 
end 

そして、あなたの仕様では、 uがtitleのparamを許可ActionController::Parameters.new方法を使用してのparamsを作成する必要があります。

let(:achievement_params) { ActionController::Parameters.new('title': 'title').permit(:title) } 

次のように:

describe 'POST create' do 
    let(:achievement_params) { ActionController::Parameters.new('title': 'title').permit(:title) } 
    let(:create_achievement) {instance_double(CreateAchievement)} 

    before do 
    allow(CreateAchievement).to receive(:new) {create_achievement} 
    end 

    it 'sends create message to CreateAchievement' do 
    expect(CreateAchievement).to receive(:new).with(achievement_params, user) 
    expect(create_achievement).to receive(:create) 

    post :create, params: {achievement: achievement_params } 
    end 
end 
関連する問題