Rails功能测试功能单独工作,但不能一起工作。使用cancan,devise,RoR4

时间:2014-05-26 09:23:02

标签: ruby-on-rails ruby-on-rails-4 rspec devise cancan

我使用的是RoR4,Cancan(1.5.0)和Devise(3.2.2)。 我正在使用Test:Unit来测试我的应用程序。 问题是,如果我在不同的函数中分离请求,它可以工作,但如果在函数内部我执行两个测试,它似乎评估第一个请求的响应,即使在后续请求之后: 这有效:

test 'admin cannot delete product that has line_items associated' do
  sign_in @admin_user
  assert_no_difference('Product.count') do 
    delete :destroy, id: @prod_to_all
  end
  assert_redirected_to product_path(@prod_to_all)
end

test 'admin can delete product that has no line_items associated' do
  sign_in @admin_user
  assert_difference('Product.count', -1) do 
      delete :destroy, id: products(:prod_to_all_not_ordered)
  end
  assert_redirected_to products_path
end

如果我把它们放在一起,那就失败了:

test 'admin cannot delete product that has line_items associated, but can delete one that has no line_items associated' do
  sign_in @admin_user
  assert_no_difference('Product.count') do 
    delete :destroy, id: @prod_to_all
  end
  assert_redirected_to product_path(@prod_to_all)

  assert_difference('Product.count', -1) do
    delete :destroy, id: products(:prod_to_all_not_ordered)
  end
  assert_redirected_to products_path
end

错误:

"Product.count" didn't change by -1.
  Expected: 5
  Actual: 6

我的问题是我有3个角色:public_user,client和admin。并且测试不同功能中每个角色的每个功能都是一种痛苦。即使对于简单的控制器,它也会变得比它应该的更大,我讨厌这个解决方案 你们有什么建议?我是否真的需要接受rspec及其上下文,或者我可以通过测试:单位并保持代码DRY? 此外,在我看来,测试单元不是很好,因为它没有正确评估第二个请求...这是一个错误或更具结构性的东西,我不理解? 谢谢

1 个答案:

答案 0 :(得分:0)

我实际上更喜欢单独的版本。它更清洁。我个人喜欢我的测试不要太干。这让他们更加冗长。我更喜欢:Duplication in Tests Is Sometimes good

Rails功能测试旨在每次测试一个请求运行。如果要测试多个请求,可以使用集成测试。 没有看到控制器代码就很难分辨出错误。可能是您的应用程序在请求期间丢失了登录用户。或者他们共享状态(例如实例变量)。使用pry或其他调试器进行调试,或者只使用普通的put来查看对象的状态。