【问题标题】:Execute an rspec test in Rails Console在 Rails 控制台中执行 rspec 测试
【发布时间】:2019-03-06 22:23:20
【问题描述】:

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

我的第一个想法是执行通常的shell命令:

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

但是有没有更简单的方法来运行规范?我正在尝试自动化一些测试(并重新发明轮子,是的),所以能够在另一个 Ruby 类中触发 rspec 测试似乎很理想。

编辑:

output = `./spec/user_spec.rb`

这将提供 rspec 输出和 $?.success?然后将提供一个通过失败值。这是这里最好的解决方案吗?或者有没有办法调用 RSpec 类本身?

【问题讨论】:

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


【解决方案1】:

正如his comment 中的Anthony 所指出的,您可以使用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

【讨论】:

    【解决方案2】:

    运行bundle exec rspec 运行所有测试或运行bundle exec rspec ./spec/user_spec.rb 运行特定测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多