控制台告诉我对象存在;耙测试不
Console tells me object exists; rake test does not
我是 rails 上 ruby 的新手,已经完成了一些教程。现在我正在尝试构建自己的应用程序并遇到问题。许多我已经能够解决,这是一次很好的学习经历,但我被这个难住了。
我创建并迁移了一个模型,其中有一个名为 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 设置为开发或测试,因为 "different environment" 是我能想到的适合症状的解决方案,但它没有帮助。我在这里错过了什么?
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
可能会发生一些事情。首先尝试运行宁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
此测试将断言卡片符号创建语句返回了一个对象。这不是一个很好的测试,但会让你朝着正确的方向前进。
后续的事情会对您有所帮助:Rspec(在 Rails 社区中可能更受欢迎的另一种测试方法)、FactoryGirl、DatabaseCleaner
如果您将测试与您的问题一起发布,那将会很有帮助,但我有一个关于哪里出了问题的理论,所以我将尝试一下。在你的测试中试试这个:
card_symbol = CardSymbol.create!(name: "hat")
card_symbol.reload
老实说,我不确定为什么,但有时 Active Record 使用缓存机制,你会得到一个陈旧的副本。我很想听听有人权衡为什么会发生这种情况。
种子文件未加载到您的测试数据库中,此外 运行 测试擦除测试数据库。
对应该存在于测试中的数据使用固定装置或工厂。
在设置方法中的测试文件中,将这一行添加为第一行。
Rails.application.load_seed
这会将 seeds.rb 中的数据加载到测试数据库中,一切正常。
感谢 Frederick Cheung,他的回答为我指明了正确的方向。
我是 rails 上 ruby 的新手,已经完成了一些教程。现在我正在尝试构建自己的应用程序并遇到问题。许多我已经能够解决,这是一次很好的学习经历,但我被这个难住了。
我创建并迁移了一个模型,其中有一个名为 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 设置为开发或测试,因为 "different environment" 是我能想到的适合症状的解决方案,但它没有帮助。我在这里错过了什么?
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
可能会发生一些事情。首先尝试运行宁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
此测试将断言卡片符号创建语句返回了一个对象。这不是一个很好的测试,但会让你朝着正确的方向前进。
后续的事情会对您有所帮助:Rspec(在 Rails 社区中可能更受欢迎的另一种测试方法)、FactoryGirl、DatabaseCleaner
如果您将测试与您的问题一起发布,那将会很有帮助,但我有一个关于哪里出了问题的理论,所以我将尝试一下。在你的测试中试试这个:
card_symbol = CardSymbol.create!(name: "hat")
card_symbol.reload
老实说,我不确定为什么,但有时 Active Record 使用缓存机制,你会得到一个陈旧的副本。我很想听听有人权衡为什么会发生这种情况。
种子文件未加载到您的测试数据库中,此外 运行 测试擦除测试数据库。
对应该存在于测试中的数据使用固定装置或工厂。
在设置方法中的测试文件中,将这一行添加为第一行。
Rails.application.load_seed
这会将 seeds.rb 中的数据加载到测试数据库中,一切正常。
感谢 Frederick Cheung,他的回答为我指明了正确的方向。