Ruby on rails 如何使用RSpec测试脚本?

Ruby on rails 如何使用RSpec测试脚本?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我正在编写一个脚本,该脚本将在生产环境中使用railsrunner运行,以对数据库进行一些一次性更改。在运行脚本之前,我希望确保它能按预期工作,因此我正在编写RSpec测试,以在编写脚本时验证其行为 如何在测试示例中调用脚本?脚本不是一个类或模块,因此没有单独的函数供我测试。相反,整个脚本将加载一次,从上到下运行,然后退出。我不知道如何在RSpec测试中调用它 我要找的东西是: 描述“我的脚本”是什么 它“应该创建正确的记录”吗 before_count=Orders.count rails r

我正在编写一个脚本,该脚本将在生产环境中使用
railsrunner
运行,以对数据库进行一些一次性更改。在运行脚本之前,我希望确保它能按预期工作,因此我正在编写RSpec测试,以在编写脚本时验证其行为

如何在测试示例中调用脚本?脚本不是一个类或模块,因此没有单独的函数供我测试。相反,整个脚本将加载一次,从上到下运行,然后退出。我不知道如何在RSpec测试中调用它

我要找的东西是:

描述“我的脚本”是什么
它“应该创建正确的记录”吗
before_count=Orders.count
rails runner my_script.rb#这里是什么?
expect(Orders.count).到eq(在计数+1之前)
结束
结束
我想您应该使用:

system('railsrunner my_script.rb')

编辑#1

如果您愿意销毁脚本,可以将脚本的活动组件移动到单独的模块中,
require

#my_script.rb
需要“./lib/my_script.rb”
MyScript.call()
#lib/my_script.rb
模块MyScript
def自助电话
#你的代码
结束
结束
然后,在测试中:

require./lib/my_script.rb'
描述“我的剧本”怎么办
它“应该创建正确的记录”吗
before_count=Orders.count
MyScript.call()在这里
expect(Orders.count).到eq(在计数+1之前)
结束
结束

我将把脚本中的逻辑移到它自己的类中。然后,您可以在脚本和测试中甚至在rails控制台中调用该类。我已经使用此模式一段时间了,它非常有用。

它看起来可以用来执行脚本:

描述“我的脚本”是什么
它“应该创建正确的记录”吗
before_count=Orders.count
加载(Rails.root.join(“path”、“to”、“my script.rb”)
expect(Orders.count).到eq(在计数+1之前)
结束
结束

我们可以为您提供帮助,但是:

我正在编写一个脚本,该脚本将在生产环境中使用rails runner运行,以对数据库进行一些一次性更改


这就是迁移的目的。像这样对db的一次性更改应该在迁移中完成。这样就避免了rspec的需要,因为像这样的任何更改都应该是可逆的,迁移应该是可逆的。

Hmmm…我可以这样做,但是有没有一种方法可以在不产生另一个进程的情况下执行脚本?可以通过放置脚本来完成我编辑了这篇文章来描述我是如何考虑这样做的。我的问题是,我希望能够将脚本交给我们的sys ops团队,让他们使用
rails runner my script.rb运行脚本。在我看来,将所有逻辑放在一个类中会使交脚本变得更加困难给我的同事编写脚本,而不需要一些复杂的运行说明。如果您使用的是
railsrunner
,您可以执行:
railsrunner“SomeClass.run”
我认为迁移不适合这种情况。我对数据库中的记录进行一次性更改,而不是对数据库架构进行一次性更改。更改的性质使它们无法恢复,如果我们建立一个新的数据库,我们就不想再这样做了。这是我的团队一直对迁移所做的事情。迁移它们在这里是关键的,因为它们创建了一个日志来记录所发生的事情。没有运行随机脚本的日志。