控制台告诉我对象存在; rake test不

时间:2016-06-08 20:25:53

标签: ruby-on-rails ruby-on-rails-4 cloud9-ide

我是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

4 个答案:

答案 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,他的回答指出了我正确的方向。