2016-11-18 43 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[:achievement]

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

而在你的規格中,喲u需要使用ActionController::Parameters.new方法允許title參數去創建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