2016-04-27 45 views
2

我是Rspec的新手。我寫了一個rspec,它檢查一個名爲「Lead controller」的控制器的創建動作。現在我想寫一個規格,它檢查名爲「status」的屬性設置爲「LEAD」。我想在創建引導之後從應用的發佈數據中檢查它。如何使用'expect'塊和'post:create'來檢查狀態?Rspec測試檢查創建的對象的值

describe 'POST #create' do 
    it "should create a lead" do 
     my_lead = Fabricate(:project, id: Faker::Number.number(10)) 
     expect{ 
     post :create, project: my_lead.attributes 
     }.to change(Project, :count).by(1) 
    end 
    it "should assign the status to lead" do 
     my_lead = Fabricate(:project, id: Faker::Number.number(10)) 
     my_lead.status.should == "LEAD" 
    end 

    end 
+0

你可以發佈你的控制器代碼嗎? –

回答

0

您可以使用assigns(:instance_variable_name)方法來訪問控制器中分配的實例變量。

例如,假設您的create動作是這樣的:

高清創建 @lead = Project.create(project_params) 結束

然後,你可以通過調用assigns(:lead)訪問@lead在RSpec的控制器例如。請注意符號文本與實例變量名稱完全匹配。

因此,更新後的測試將是這個樣子:

it "should assign the status to lead" do 
    my_lead = Fabricate(:project, id: Faker::Number.number(10)) 

    post :create, project: my_lead.attributes 

    # Test that the status for @lead in our controller matches what we expect it to: 
    assigns(:lead).status.should == "LEAD" 
end 
+0

嗨安東尼感謝您的解決方案。:)但是當我這樣做,2項目正在創建: 失敗/錯誤: 期望{ post:創建,項目:my_lead.attributes } .to更改(項目,:計數).by(1) expected #count已經改變了1,但被改變了2 – user191990

0

你的第二個測試有如果創建的對象的狀態設置爲測試預期:

describe '#create' do 
    let!(:my_lead) { Fabricate(:project, id: Faker::Number.number(10)) } 

    it "should create a lead" do 
    expect{ post :create, project: my_lead.attributes } 
     .to change(Project, :count).by(+1) 
    end 

    it "should assign the status to lead" do 
    post :create, project: my_lead.attributes 
    expect(Project.last.status).to eq('LEAD') 
    end 
end 
+0

嗨Jethroo感謝您的解決方案:)但是當我這樣做時,2個項目正在創建:Failure/Error:expect { post:create,project:my_lead.attributes} .to改變(Project,:count).by(1)預期#count已經改變了1,但被改變了2 – user191990

+0

哦對,let塊被調用期望阻止所以你創建my_lead和控制器動作中的一個,你可以做一個let! (直接在測試之前創建對象,而不是僅在第一次調用時創建對象),或者更好地傳遞一個包含值的散列:create(使您的測試更快,因爲您只敲擊一次db) – jethroo

0

最後我來到用一個小小的改變解決了我的問題

describe 'POST #create' do 
    it "should create a lead" do 
     my_lead = Fabricate(:project, id: Faker::Number.number(10)) 
     expect{ 
     post :create, project: my_lead.attributes 
     }.to change(Project, :count).by(1) 
    end 
    it "should assign the status to lead" do 
     my_lead = Fabricate(:project, id: Faker::Number.number(10)) 
     post :create, project: my_lead.attributes 
     expect(Project.last.status).to eq('LEAD') 
    end 
    end