【问题标题】:Rspec test to check the value of created objectRspec测试检查创建对象的值
【发布时间】:2016-04-27 14:19:36
【问题描述】:

我是 Rspec 的新手。我编写了一个 rspec 来检查一个名为“Lead controller”的控制器的创建操作。现在我想编写一个规范来检查名为“status”的属性是否设置为“LEAD”。我想在创建潜在客户后从应用程序的发布数据中检查它。如何使用 'expect' 块和 'post :create' 来检查状态?

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

【问题讨论】:

  • 您也可以发布您的控制器代码吗?

标签: ruby-on-rails rspec mongoid


【解决方案1】:

您可以使用assigns(:instance_variable_name) 方法访问控制器中分配的实例变量。

例如,假设您的 create 操作如下所示:

定义创建 @lead = Project.create(project_params) 结束

然后您可以通过调用assigns(:lead) 在您的 RSpec 控制器示例中访问@lead。请注意符号文本与实例变量名称完全匹配。

因此,您更新后的测试将如下所示:

 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

【讨论】:

  • 嗨 Anthony 感谢您的解决方案。:) 但是当我这样做时,正在创建 2 个项目:失败/错误:expect{ post :create, project: my_lead.attributes }.to change(Project , :count).by(1) 预期 #count 已更改 1,但已更改 2
【解决方案2】:

您的第二个测试必须测试已创建对象的状态是否按预期设置:

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

【讨论】:

  • 嗨 Jethroo 感谢您的解决方案。:) 但是当我这样做时,正在创建 2 个项目:失败/错误:expect{ post :create, project: my_lead.attributes }.to change(Project , :count).by(1) 预期 #count 已更改 1,但已更改 2
  • 哦,对了,let 块在 expect 块中被调用,所以你创建 my_lead 和控制器动作中的那个,你可以做一个 let! (直接在测试之前创建对象,而不仅仅是在第一次调用时)或者更好地只是将带有值的哈希传递给帖子:create(使您的测试更快,因为您只打了一次数据库)
【解决方案3】:

最后我想出了一个小改变,解决了我的问题

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

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多