RSpec使用let vs block参数共享示例

时间:2014-06-29 20:20:36

标签: rspec interface tdd

Sandi Metz" Ruby中的实用面向对象设计"使用Minitest来演示为测试角色编写共享测试。所以我在考虑如何做RSpec等效 wheel扮演diameterizable的角色。 diameterizable被定义为响应width的对象。到目前为止,我提出了两个不同的版本,以使该对象可用于共享示例。哪种方法更好?还是有更好的方法?

版本1,使用let:

# wheel_spec.rb
RSpec.describe Wheel do
  let(:wheel) { Wheel.new(26, 1.5) }

  it_behaves_like "a diameterizable" do
    let(:diameterizable) { wheel }
  end

  # wheel is available for use ...
end

# diameterizable_interface.rb
RSpec.shared_examples "a diameterizable" do
  it "implements the diameterizable interface" do
    expect(diameterizable).to respond_to(:width)
  end
end

版本2,使用块参数:

# wheel_spec.rb
RSpec.describe Wheel do
  let(:wheel) { Wheel.new(26, 1.5) }

  it_behaves_like "a diameterizable", Wheel.new

  # wheel is available for use ...
end

# diameterizable_interface.rb
RSpec.shared_examples "a diameterizable" do |diameterizable|
  it "implements the diameterizable interface" do
    expect(diameterizable).to respond_to(:width)
  end
end 

1 个答案:

答案 0 :(得分:2)

这似乎是使用隐含主题的好时机:

RSpec.shared_examples "a diameterizable" do
  it "implements the diameterizable interface" do
    expect(subject).to respond_to(:width)
  end
end

RSpec.describe Wheel do
  let(:wheel) { Wheel.new(26, 1.5) }
  subject { wheel }

  it_behaves_like "a diameterizable"
end

btw你的第二个版本为共享示例创建了一个新的Wheel,这可能会产生问题。