>假设我的用户模型有一个user_spec.rb,我想在rails控制台中运行该测试。
我的第一个想法是执行通常的 shell 命令:
exec("./spec/user_spec.rb")
但是有没有更简单的方法来运行规范?我正在尝试自动化一些测试(并稍微重新发明轮子,是的(,因此能够在另一个 Ruby 类中触发 rspec 测试似乎是理想的。
编辑:
output = `./spec/user_spec.rb`
这将提供 rspec 输出和 $?。成功?然后,将提供通过失败值。这是这里最好的解决方案吗?或者有没有办法调用 RSpec 类本身?
正如 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
JSON.parse(error_stream.string)
end
results =
if output_stream.string
JSON.parse(output_stream.string)
end
运行bundle exec rspec
以运行所有测试或bundle exec rspec ./spec/user_spec.rb
运行特定测试