说我的用户模型有一个user_spec.rb,我想在rails控制台中运行该测试。
我首先想到的是执行通常的shell命令:
exec("./spec/user_spec.rb")
但是有没有更简单的方法来运行规范?我正在尝试使一些测试自动化(并稍微创新一下,是的),因此能够在另一个Ruby类中触发rspec测试似乎是理想的。
编辑:
output = `./spec/user_spec.rb`
这将提供rspec输出和$ ?. success?然后将提供通过失败值。这是最好的解决方案吗?还是有一种方法本身可以调用RSpec类?
答案 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