4

我的验收测试(RSpec/Capybara)在一个it...do块下有一些很长的步骤序列,我想手动将每个步骤的一些附加文档添加到 RSpec 文档输出中。

因此,RSpec 输出(以文档格式)当前如下所示:

FooController
  New user creates account and creates profile
    it passes

在漫长的步骤序列中,我想将一些附加信息推送到输出:

FooController
  New user creates account and creates profile
    ... new user saw signup page!
    ... new user got email confirmation!
    ... confirmation link worked!
    ... new user saw empty profile!
    ... new user filled in profile
    it passes

在记录应用程序方面,这些额外的语句比带有单个“它通过”结果消息的大黑匣子要好。

由于显然没有办法使用多个it...do块来构建验收测试的长序列,我希望有一种简单的方法可以将附加消息推送到 RSpec 输出流,理想情况下它们被缩进和显示(红色/green) 好像它们是 pat 或单独的it...do示例。

4

2 回答 2

1

最终,我选择了自定义DocumentationFormatter,方法是在文件夹中的某处包含以下代码spec/support(以确保自动加载):

require "rspec/core/formatters/documentation_formatter"

class RSpec::Core::ExampleGroup
  def step(msg)
    example.metadata[:step_messages] << msg if example.metadata[:step_messages]
    yield
  end
end

class RSpec::Core::Formatters::DocumentationFormatter
  def example_started(example)
    example.metadata[:step_messages] = []
  end

  def example_passed(example)
    output.puts passed_output(example)
    print_steps(example)
  end

  private
    def print_steps(example)
      example.metadata[:step_messages].each do |msg|
      output.puts detail_color("#{'  ' * (@group_level + 1)}#{msg}")
    end
  end
end

通过这个技巧,您可以获得一种step可以在您的it块中使用的方法。运行 rspec 时,将打印出--format documentation来自块的相关消息,并适当缩进。step例如下面的代码

it "should show all and only appoved posts" do
  step "show all approved posts" do
    Post.all.approved.each do |post|
      should have_content(post.title)
    end
  end
  step "show only approved posts" do
    should have_selector(".post", count: Post.all.approved.count)
  end
end

将产生以下输出(步骤字符串以浅蓝色着色):

should show all and only appoved posts
  show all approved posts
  show only approved posts

诚然,这是一个非常粗略的解决方案,但通过多做一些工作,它可能会变得更好。

于 2014-05-03T16:17:15.337 回答
0

这就是我所做的...在我的规范中添加了一个 nextstep("message") 方法,该方法使用 awesome_print gem 将“消息”输出到控制台,这样我就可以给它上色,也可以给记录器上色。

  def nextstep(txt)
    $step += 1
    @speclog.debug ''
    @speclog.debug ''
    @speclog.debug "#{$scene}, step: #{$step}: " + txt
    ap (' ' * ($indent * 2 - 1)) + "step: #{$step}: " + txt, {:color => {:string => :blueish}}
  end

有点骇人听闻,但它确实在运行 rspec 时为我们提供了非常好的描述性输出,例如,如果我们有

it "New user creates account and creates profile" do
   # some assertions
   nextstep "... new user saw signup page!"
   # some assertions
   nextstep " ... new user got email confirmation!"
   # some assertions
   nextstep " ... confirmation link worked!"
   # some assertions
   nextstep "... new user saw empty profile!"
   # some assertions
   nextstep "... new user filled in profile"
end

如问题所示,我们得到更具描述性的规范输出(如果出现故障,我们会看到我们正在执行的步骤):

   step 1: ... new user saw signup page!
   step 2: ... new user got email confirmation!
   step 3: ... confirmation link worked!
   step 4: ... new user saw empty profile!
   step 5: ... new user filled in profile"
于 2013-01-19T01:46:19.693 回答