2016-11-18 8 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 

오류 : 당신을 "허가"를 POST 값이 필요하기 때문이다

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

, 귀하의 컨트롤러 :

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 

그리고 당신의 스펙에, 요 다음과 같은

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 
유는 title PARAM을 허용하는 ActionController::Parameters.new 방법을 사용하여 PARAMS를 작성해야