有没有办法在RSpec中注释测试?

时间:2014-08-28 14:17:46

标签: ruby-on-rails rspec

我经常遇到RSpec的问题,当我想循环一系列条件时,我想在测试输出中打印一些东西来解释我在其中的位置。例如:

  it "should save & serialize all attributes" do
    @raw_user_attrs.each do |attr_name, value|
      expect( @twitter_user.send(attr_name) ).to eq value
      expect( @twitter_user.raw_attrs[attr_name]).to eq value
    end
  end

此测试的问题在于,当它失败时,您无法查看导致其失败的属性,输出类似于:

1) TwitterUser Raw user loading: data loading should save & serialize all attributes except created_at (auto test)
   Failure/Error: expect( @twitter_user.send(attr_name) ).to eq value

     expected: false
          got: nil

     (compared using ==)
   # ./spec/models/twitter_user_spec.rb:38:in `block (5 levels) in <top (required)>'
   # ./spec/models/twitter_user_spec.rb:37:in `each'
   # ./spec/models/twitter_user_spec.rb:37:in `block (4 levels) in <top (required)>'

这个输出的问题是我不知道它实际上失败了哪个属性。

如何打印显示实际失败的行?

如果我可以将测试包装在循环中,那就太好了。

raw_user_attrs.except(:created_at).each do |attr_name, value|
  it "should save & serialize #{attr_name}" do

    @twitter_user.save

    expect( @twitter_user.send(attr_name) ).to eq value
    expect( @twitter_user.raw_attrs[attr_name]).to eq value

  end
end

这会将变量打印到实际的测试名称中。但是,变量在测试范围之外是不可用的,因此这不起作用。

有没有办法在测试失败时打印出更多信息?

1 个答案:

答案 0 :(得分:1)

除了运算符匹配(例如should be > 1)之外,您可以非常轻松地执行此操作。来自Relish app documentation

expect(array).to be_empty, "expected empty array, got #{array.inspect}"

所以你可以在...上添加预期的消息。

在某些情况下你可以做的其他事情是循环数据,然后在循环中执行it,给每个人一个好名字。例如:

[:method1, :method2].each do |method_sym|
  it "doesn't fail when calling method: #{method_sym}" do
    expect { @object.send(method_sym) }.to_not raise_error
  end
end