我有一个与运动队打交道的Rails应用程序。有一个模型,Club
,包含所有团队,它们与Match
等相关。应用程序以这些俱乐部中的一个为中心,并依赖于该记录的存在。我有一个定义主俱乐部的应用程序助手方法,基本上是:
def main_club
@main_club ||= Club.find_by(abbrv: 'CLB')
end
然后在控制器逻辑中引用(可以为main_club
执行某些您不能为其他人执行的操作)和视图(显示有关即将进行的匹配的某些关键信息等)。
这对我来说很麻烦。硬代码依赖“软”数据库记录?但我确实需要俱乐部成为一个记录,以允许其所有的关系。
我只是原样离开了它,但它搞砸了RSpec。即使在Rails.application.load_seed
中运行config.before(:suite)
,我也会不断调整规格,因为它无法调用.matches
,例如nil
。
这种事情是否有既定的做法?我应该怎么做呢?
编辑:种子文件包含所有当前俱乐部(包括主要俱乐部),可能会在管理界面/控制器中添加更多内容。 RSpec问题可能来自DatabaseCleaner做错了,但是a)我不确定那会是什么,以及b)无论RSpec如何,我对依赖“软”数据库记录的硬代码的担忧仍然存在。
答案 0 :(得分:1)
应用程序要求数据库中的行存在才能正常运行,例如表示权限和角色的行,国家/地区代码等,这是完全正常的。
如果您考虑ActiveRecord如何依赖于架构,这可能会让您感觉更好。 Rails应用程序取决于数据库,而不是相反。根据数据库中的行不是一个很大的飞跃。
如此全速前进。你只需要了解一些细节。
可能存在问题的一个细节是,如果您将DatabaseCleaner与策略: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
如果您没有使用策略:truncation
,请保持简单并且不要使用DatabaseCleaner,只需在spec_helper.rb / rails_helper.rb中使用config.use_transactional_fixtures = true
。