在Rails控制台中执行rspec测试

时间:2018-10-01 19:07:23

标签: ruby-on-rails ruby rspec rspec-rails

说我的用户模型有一个user_spec.rb,我想在rails控制台中运行该测试。

我首先想到的是执行通常的shell命令:

exec("./spec/user_spec.rb")

但是有没有更简单的方法来运行规范?我正在尝试使一些测试自动化(并稍微创新一下,是的),因此能够在另一个Ruby类中触发rspec测试似乎是理想的。

编辑:

output = `./spec/user_spec.rb`

这将提供rspec输出和$ ?. success?然后将提供通过失败值。这是最好的解决方案吗?还是有一种方法本身可以调用RSpec类?

1 个答案:

答案 0 :(得分:0)

正如 Anthony 中的 his comment 所指出的,您可以使用 RSpec::Core::Runner 基本上从代码或交互式控制台调用命令行行为。但是,如果您使用 Rails 之类的东西,请考虑将您的环境设置为开发环境(甚至生产环境,如果您将在此处执行代码)。因此,请确保您所做的一切都没有任何不必要的副作用。

另一件需要考虑的事情是,RSpec 全局存储其配置,包括之前向其注册的所有示例组。这就是您需要在后续运行之间重置 RSpec 的原因。这可以通过 RSpec.reset 完成。

所以把它们放在一起,你会得到:

require 'rspec/core'
RSpec::Core::Runner.run(['spec/path/to_spec_1.rb', 'spec/path/to_spec_2.rb'])
RSpec.reset

RSpec::Core::Runner.run 的调用将输出到标准输出并作为结果返回退出代码(0 表示没有错误,非零退出代码表示测试失败)。

..

Finished in 0.01791 seconds (files took 17.25 seconds to load)
2 example, 0 failures

=> 0

您还可以将其他 IO 对象传递给 RSpec::Core::Runner.run 以指定它应该输出到的位置。您还可以将其他命令行参数传递给 RSpec::Core::Runner.run 的第一个数组,例如'--format=json' 以 JSON 格式输出结果。

因此,例如,如果您想以 JSON 格式捕获输出,然后进一步对其进行处理,您可以执行以下操作:

require 'rspec/core'

error_stream = StringIO.new
output_stream = StringIO.new

RSpec::Core::Runner.run(
  [
    'spec/path/to_spec_1.rb',
    'spec/path/to_spec_2.rb',
    '--format=json'
  ],
  error_stream,
  output_stream
)

RSpec.reset

errors =
  if error_stream.string.present?
    JSON.parse(error_stream.string)
  end

results =
  if output_stream.string.present?
    JSON.parse(output_stream.string)
  end