我正在尝试使用fixture来添加更复杂的测试数据,以便使用Flex中的前端测试特定场景。我不确定这是用rails做正确的方法。我的rails应用程序是一款纸牌游戏,而我正在尝试测试的“更复杂的测试数据”是各种卡组合。
例如,我想设置一个测试游戏,其中玩家1手中持有卡B和C,我在这里特别将卡B和C添加到玩家的手中。
我为玩家,游戏和用户提供基本设备,这些设备已经存在了一段时间并且工作正常。我试图在游戏夹具中添加以下erb代码,以调用Game.start方法,并且正在获取
NoMethodError: undefined method `games' for main:Object
灯具代码片段为:
four:
id: 4
num_players: 3
turn_num: 0
status_id: 1
<% game_four = games(:four).find
game_four.start
%>
答案 0 :(得分:5)
game_four = games(:four).find
游戏方法仅存在于测试用例中,而不存在于固定装置中。 您应该查询数据库或使用关系。 这只是一个例子。
four:
id: 4
num_players: 3
turn_num: 0
status_id: 1
<% Game.find_by_name(four).start %>
此外,这不是真正适合这种命令的地方。固定装置不是“开始游戏”。 您应该将此命令移动到其他地方,可能是在设置块中的专用测试用例中。
修改强>
我在这里复制了几天前在原始答案中发布的评论,其中包含指向新Rails数据库种子功能的链接:http://ryandaigle.com/articles/2009/5/13/what-s-new-in-edge-rails-database-seeding
这是Yehuda Katz在他的回答中解释的那个,绝对是解决这个问题的最佳方法。
答案 1 :(得分:4)
可能最好的解决方案(事实上,现在正在封存的那个)是在db目录中有一个seed.rb文件,你可以从rake任务加载。
这是Rails现在在边缘做的事情(在Rails 3中)。
# db/seeds.rb
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#
# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
# Major.create(:name => 'Daley', :city => cities.first)
然后是一个新的rake任务(你可以添加到你的Rakefile中):
desc 'Load the seed data from db/seeds.rb'
task :seed => :environment do
seed_file = File.join(Rails.root, 'db', 'seeds.rb')
load(seed_file) if File.exist?(seed_file)
end
如果以这种方式设置seeds.rb文件,您将遵循新约定,并且能够在升级到Rails 3时删除种子rake任务。
此外,数据的迁移不。据我所知,这已经很成熟并且是Rails核心团队的普遍意见。
答案 2 :(得分:0)
如果你想使用fixtures方法(当加载数据用于开发时,而不是在测试期间),你可以使用fixtures_references插件。它的行为是一样的。