2011-05-26 48 views
6

我希望能够在Heroku上的演示应用程序上运行rspec和黄瓜。我有一个单独的生产应用程序,我将我的开发分支推向舞台,将我的主分支推向生产。你如何在Heroku上运行rspec和黄瓜?

我已经将RACK_ENV变量设置为'staging'并且还添加了一个staging.rb配置文件。

运行RSpec的,黄瓜在本地:

两个RSpec的,黄瓜运行正常本地使用命令

$ rspec spec 

..

$ cucumber features 

在Heroku上升级应用 rspec的运行

问题是我无法让他们在我的Heroku分段程序上运行。我明白,RSPEC在Heroku上正确的做法是:

$ heroku rake spec --remote staging 

每当我跑这虽然我得到以下错误:

rake aborted! 
You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.[] 
/app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.0.7/lib/active_record/railties/databases.rake:429:in `block (3 levels) in <top (required)>' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `call' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `block in execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:581:in `invoke' 
/app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.0.7/lib/active_record/railties/databases.rake:460:in `block (3 levels) in <top (required)>' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `call' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `block in execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:581:in `invoke' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2013:in `top_level' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:1992:in `run' 
/usr/ruby1.9.2/bin/rake:31:in `<main>' 
(in /app) 

在Heroku上升级应用程序运行黄瓜

同样:

$ heroku rake cucumber --remote staging 

结果于:

rake aborted! 
You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.[] 
/app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.0.7/lib/active_record/railties/databases.rake:429:in `block (3 levels) in <top (required)>' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `call' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `block in execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:581:in `invoke' 
/app/.bundle/gems/ruby/1.9.1/gems/activerecord-3.0.7/lib/active_record/railties/databases.rake:460:in `block (3 levels) in <top (required)>' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `call' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:634:in `block in execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:629:in `execute' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:595:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:605:in `block in invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:602:in `invoke_prerequisites' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:594:in `block in invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:588:in `invoke_with_call_chain' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:581:in `invoke' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2041:in `invoke_task' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `each' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2013:in `top_level' 
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:1992:in `run' 
/usr/ruby1.9.2/bin/rake:31:in `<main>' 
(in /app) 

这个问题显然是与数据库有关,但我不知道如何解决它。

+0

你在'database.yml'中设置了'staging'吗? – 2011-05-26 15:25:55

+0

@Thomas是的我可以 – 2011-05-27 11:32:46

+0

你能解释为什么你想在Heroku上运行这些吗?这不一定是个坏主意,因为您的开发平台可能存在差异,但我只是想知道您的想法是什么,因为大多数人只会在本地运行它们,并在像哈德森这样的持续集成环境中运行它们。 – 2011-05-27 13:40:30

回答

5

问题是测试使用单独的数据库,而不是运行应用程序的数据库。这第二个数据库你没有在Heroku上得到。有关类似问题的答案,请参阅Running Rails unit tests on Heroku

+0

谢谢你。如果你只是在heroku上使用单独的实例,那么你可以使用该实例上的生产数据库进行测试? – 2011-08-15 09:20:11

+0

您可以创建一个单独的实例进行测试,将RACK_ENV设置为“测试”,然后使用生产数据库进行测试(请参阅http://stackoverflow.com/questions/5981508/share-database-between-2-apps-in -heroku/5981700#5981700),但要小心,运行测试会在您每次运行数据库时清除数据库。 – eugen 2011-08-15 10:00:20

+0

太好了,谢谢,我会试试看 – 2011-08-15 11:45:31