为什么固定装置中的ERB代码会抛出“未定义的方法”?

时间:2009-06-25 14:10:37

标签: ruby-on-rails ruby testing

我正在尝试使用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
%>

3 个答案:

答案 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插件。它的行为是一样的。