我经常遇到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
这会将变量打印到实际的测试名称中。但是,变量在测试范围之外是不可用的,因此这不起作用。
有没有办法在测试失败时打印出更多信息?
答案 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