如何在rspec中的lambda之后测试多个东西?

时间:2011-03-21 16:19:52

标签: ruby-on-rails controller rspec

所以我在Rails中使用rspec这样的东西:

it "should create a new user" do
  lambda do
    post :create, @attr
  end.should change(User,:count)
end

但是帖子:create,@ attr创建了一个用户和一个公司,那么如何“链接”更改调用以便我可以测试它们? 我正在寻找的是end.should change(User,:count) && change(Company,:count)

3 个答案:

答案 0 :(得分:8)

我认为你试图在一次测试中断言很多,但它与测试的名称不符。请考虑一下:

it "should create a new user" do
  lambda do
    post :create, @attr
  end.should change(User,:count)
end

it "should create a new company" do
  lambda do
    post :create, @attr
  end.should change(Company,:count)
end

另外,你可能没有意识到有一种更好的方式来编写那些做同样事情的断言,但读得更好:

expect {
  post :create, @attr
}.to change(Company, :count)

答案 1 :(得分:1)

作为开发人员成长几年后,我发现了一个非常干净的解决方案,可以在需要时测试多个值:

expect{ execute }.to change{ [spe1.reload.trashed?, spe2.reload.trashed?] }.from([true, true]).to([false, false])

但是当我们确实需要测试多个记录的创建时:

[User, Company].each do |klass|
  it "creates one #{klass}" do
    expect{ post :create, valid_args }.to change(klass, :count).by(1)
  end
end

答案 2 :(得分:0)

@idlefingers - re:

  

“我认为你在一次测试中试图断言很多   与测试名称“

不匹配
  • 但是,有时候,出于性能原因以及让测试套件时间缩短,我不希望另一个单独的示例执行另一个断言。

要解决这个问题,你可以使用这个技巧:

def user_and_company_count
  User.count + Company.count
end

it "can assert both counts" do
  expect { post :create, @attr }.to change(self, :article_an_activity_count).by(2)
end