我还是一个新手,我很难过:我有一个'find_by'语句在生产环境中执行时工作正常,但在测试过程中失败了,到目前为止我可以确定相同的输入。
我有一个非常简单的表,由seeds.rb填充如下:
Nonprofit.create!(id: 1, name: "Nonprofit number 1")
Nonprofit.create!(id: 2, name: "Nonprofit number 2")
在我的会话控制器中,我有以下两个陈述:
puts "=======>" + params[:nonprofit_id] + "<=============="
nonprofit = Nonprofit.find_by(id: params[nonprofit_id])
puts "=======>" + nonprofit.name + "<=============="
在生产环境中,日志显示:
Processing by SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Mm7qVchebMORY5QBOlvl1ac69m1ACwttXcE71LbfHnHH2RqpB6mSP+wFxodop/9Mgv/NlLO9V9NVEcTU1a54tw==", "session"=>{"email"=>"jane@rich.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "nonprofit_id"=>"1", "commit"=>"Log in"}
==================>>>1<=========
Nonprofit Load (0.3ms) SELECT `nonprofits`.* FROM `nonprofits` WHERE `nonprofits`.`id` = 1 LIMIT 1
==================>>> Nonprofit number 1
换句话说,ActiveRecord使用id值1找到正确的表条目。
来自测试运行的日志显示与'puts'完全相同的输出,但随后它在第二个'puts'上出错,因为(推测)find_by没有找到记录。这是测试运行的日志:
==================&GT;&GT;→1&LT; ====== ë
以0.467105s完成,2.1408次/秒,0.0000次断言/秒。
1)错误:
UsersIndexTest#test_index_as_non管理员:
NoMethodError:未定义的方法name' for nil:NilClass
app/controllers/sessions_controller.rb:14:in
创建'
test / test_helper.rb:19:in log_in_as'
test/integration/users_index_test.rb:29:in
块中的'
任何想法/建议?或者(或另外)如何使测试运行日志显示活动记录查询,如生产运行的日志显示?
谢谢!
答案 0 :(得分:1)
您的测试无法找到您要查找的记录,因为Rails未将seed.rb
加载到测试数据库中。
你应该使用像FactoryGirl,Fixtures这样的东西,或者只是在before(:each)
块中创建记录。任何Rails测试教程都会有关于Fixtures,FactoryGirl或其他一些将数据导入测试的方法。 This may be a good way to start.
或者,如果您确实需要将seeds.rb
中的内容加载到测试数据库中,可以尝试doing this。
答案 1 :(得分:1)
Rails适用于不同的环境。在测试环境中测试你的(duh)。在本地运行应用程序时(使用rails server
),您处于开发环境中。在服务器上运行时,它应该在生产环境中。
每个环境都有自己的数据库。我想你运行'rake db:seed'并认为它会填充你的测试数据库,但事实并非如此。这就是为什么它没有找到记录 - 在测试数据库上它不存在。
正如@pggaspar所指出的,您应该使用工厂或工具来填充测试数据库。