我是ruby on rails的新手并且已经完成了一些教程。现在我正在尝试构建自己的应用程序并遇到问题。很多我已经能够工作,这是一个很好的学习经历,但这个我很难过。
我创建了一个模型,迁移它,有一个名为CardSymbol的模型,它由一个id字段和一个名字组成。我在我运行的seeds.rb文件中有这个。
CardSymbol.create!(name: "hat")
我可以打开rails控制台,在...中输入
CardSymbol.find_by(name: "hat").id
...我得到1,主键,这就是我的期望。所以我知道记录在数据库中。
然而在我的一个test.rb文件中,我有完全相同的代码,但是当我运行bundle exec rake test并且我得到了
NoMethodError: undefined method `id' for nil:NilClass
所以...这似乎告诉我它找不到我所知道的记录。我尝试在我的测试文件中将Rails.env设置为开发或测试,因为“不同的环境”是我能想到的一个适合症状的解决方案,但它没有帮助。我在这里缺少什么?
PS我非常确信测试代码不是问题,但是当多个人要求它时,我将它全部删回到以下&仍然有错误(注意这是一个错误,而不是测试失败)。require 'test_helper'
class CardTypeTest < ActiveSupport::TestCase
def setup
@example_card_symbol = CardSymbol.find_by(name: "hat").id
end
test "should be valid" do
assert 1==1
end
end
答案 0 :(得分:3)
有一些事情可能会发生。首先尝试运行rake db:test:prepare
。这将确保您的测试数据库已迁移和设置。需要注意的一点是,当您在本地控制台中运行时,您已连接到开发数据库。但是,当您运行测试时,它们将连接一个单独的测试数据库。
要考虑的下一个问题是,如果您未在测试中创建数据库,则不应尝试访问和对象。所有测试都应该能够独立运行,这意味着他们可以创建所需的数据,对其进行测试并在完成后进行清理。
编辑:测试发布后的更新。
因此,在您的测试中,您正在搜索尚不存在的内容。我对Rspec比较熟悉,但下面的测试应该通过。
require 'test_helper'
class CardTypeTest < ActiveSupport::TestCase
def setup
@example_card_symbol = CardSymbol.create(name: "hat")
end
test "should be valid" do
assert @example_card_symbol.valid?
# or maybe: assert @example_card_symbol.persisted?
end
end
此测试将断言卡符号create语句返回一个对象。这不是一个很好的测试,但会让你朝着正确的方向前进。
跟进的内容对你有所帮助:Rspec(在Rails社区中更受欢迎的另一个测试,),FactoryGirl,DatabaseCleaner
答案 1 :(得分:2)
种子文件未加载到测试数据库中,此外运行测试会擦除测试数据库。
使用灯具或工厂获取测试中应存在的数据。
答案 2 :(得分:0)
如果你用你的问题发布你的测试会有所帮助,但我有一个关于什么是错的理论,所以我要去试一试。在你的测试中试试这个:
card_symbol = CardSymbol.create!(name: "hat")
card_symbol.reload
老实说,我不确定为什么,但有时Active Record使用缓存机制,你得到一个陈旧的副本。我很想听到有人在谈论为什么会这样。
答案 3 :(得分:0)
在setup方法的测试文件中,将此行添加为第一行。
Rails.application.load_seed
然后,这将把seeds.rb中的数据加载到测试数据库中,一切正常。
感谢Frederick Cheung,他的回答指出了我正确的方向。