2

我有一个处理运动队的 Rails 应用程序。有一个模型,Club包含所有球队,它们与Matches 等有关。该应用程序以其中一个俱乐部为中心,并依赖于该记录的存在。我有一个定义主俱乐部的应用程序辅助方法,本质上是:

def main_club
  @main_club ||= Club.find_by(abbrv: 'CLB')
end

然后在控制器逻辑(可以做某些main_club你不能为其他人做的事情)和视图(显示有关即将到来的比赛的某些关键信息等)中引用它。

这让我感觉很乱。依赖“软”数据库记录的硬代码?但我确实需要俱乐部成为记录,以允许其所有关系。

我只是保持原样,但它弄乱了 RSpec。即使在 中运行Rails.application.load_seedconfig.before(:suite)我也经常遇到规格失败,因为它无法调用.matches,例如 on nil

这种事情有既定的做法吗?我该怎么办?

编辑:种子文件包括所有当前的俱乐部(包括主俱乐部),有可能在管理界面/控制器中添加更多。RSpec 问题可能来自 DatabaseCleaner 做错了什么,但是 a)我不确定那会是什么,b)我对依赖“软”数据库记录的硬代码的担忧仍然存在,无论 RSpec 是什么。

4

1 回答 1

1

应用程序要求数据库中的行存在才能正常运行是完全正常的,例如代表权限和角色、国家代码等的行。

如果您考虑一下 ActiveRecord 是如何依赖模式的,这可能会让您感觉更好。Rails 应用程序依赖于数据库,而不是相反。依赖于数据库中的行并不是一个很大的飞跃。

所以全速前进你的方法。你只需要得到一些正确的细节。

可能存在问题的一个细节是,如果您将 DatabaseCleaner 与 strategy 一起使用:truncation,则需要告诉 DatabaseCleaner 不要截断您的种子。在您的 spec_helper.rb (RSpec 2) 或 rails_helper.rb (RSpec 3) 中:

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with :truncation, except: ['clubs']
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning { example.run }
  end

end

如果您想删除在测试期间创建的其他俱乐部,您必须手动执行此操作:

RSpec.configure do |config|
  config.after(:each) do
    Club.where("abbrv not in(?)", %w(CLBS N YR SDS))
  end
end

如果您不使用 strategy :truncation,请保持简单,不要打扰 DatabaseCleaner,只需config.use_transactional_fixtures = true在您的 spec_helper.rb/rails_helper.rb 中使用。

于 2014-08-24T16:02:58.240 回答