2013-10-15 141 views
1

後得到了堅持:'未定義的方法' 和Rails和RSpec

' undefined method `post' for #<Class:0x000001058c0f68> (NoMethodError)' 

在檢查控制create行動。

我使用Rails 4,rpsec和工廠女孩

控制器:

def create 
    @post = Post.new(post_params) 
    @post.user_id = current_user.id 

    if @post.save 
    flash[:success] = "Yay! Post created!" 
    redirect_to root_path 
    else 
    # flash[:error] = @post.errors.full_messages 
    render 'new' 
    end 
end 

測試:

describe '#create' do 
    post 'create', FactoryGirl.attributes_for(:post, user: @user) 
    response.should be_successful 
end 

回答

5

我覺得post方法是內部it方法塊訪問:

describe 'create' do 
    it 'should be successful' do 
    post :create, FactoryGirl.attributes_for(:post, user: @user) 
    response.should be_success 
    end 
end 

順便說一句我認爲你需要測試重定向,而不是success狀態。

0

問題來自post應在it聲明中使用的事實。我通常會測試我的控制器,如下所示:

describe 'POST "create"' do 

    let(:user) { User.new } 
    let(:params) { FactoryGirl.attributes_for(:post, user: user) } 
    let(:action) { post :create, params } 
    let!(:post) { Post.new } 

    before do 
    Post.should_receive(:new).and_return(post) 
    end 

    context 'on success' do 

    before do 
     post.should_receive(:save).and_return(true) 
    end 

    it 'renders success' do 
     action 
     expect(response).to be_success 
    end 

    it 'redirects' do 
     action 
     expect(response).to be_redirected 
    end 

    it 'sets flash message' do 
     action 
     expect(flash[:success]).to_not be_empty 
    end 

    end 

    context 'on failure' do 

    before do 
     post.should_receive(:save).and_return(false) 
    end 

    it 'renders new' do 
     action 
     expect(response).to render_template(:new) 
    end 

    end 
end 
2

對不起,我只是想給你一些建議。

請考慮以下best practices並使用RSpec的expect語法而不是should。瞭解更多關於爲什麼要語法是一個壞主意在這裏:http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax

這是我怎麼會重寫你的榜樣:

describe 'create' do 
    it 'responds with 201' do 
    post :create, attributes_for(:post, user: @user) 
    expect(response.status).to eq(201) 
    end 
end 

在這個例子中我使用FactoryGirl的短語法方法attributes_for代替FactoryGirl.attributes_for,它節省了幾個字節。以下是如何使短期可用的方法(在投機/ test_helper.rb中):

RSpec.configure do |config| 
    config.include FactoryGirl::Syntax::Methods 
end 

我測試了狀態碼201 Rails會默認爲成功創建行動回報(重定向應該是3XX)這使得測試更具體。

希望它可以幫助您編寫更好的規格。

相關問題