2016-04-27 42 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