使用let与block参数的RSpec共享_示例

使用let与block参数的RSpec共享_示例,rspec,interface,tdd,Rspec,Interface,Tdd,Sandi Metz的“Ruby中的实用面向对象设计”使用Minitest演示如何编写共享测试来测试角色。因此,我正在考虑如何进行RSpec等效。 车轮起到可测量直径的作用。直径可测量的被定义为响应宽度的对象。到目前为止,我提出了两个不同的版本,使该对象可用于共享示例。哪种方法更好,还是有更好的方法 版本1,使用let: # wheel_spec.rb RSpec.describe Wheel do let(:wheel) { Wheel.new(26, 1.5) } it_behav

Sandi Metz的“Ruby中的实用面向对象设计”使用Minitest演示如何编写共享测试来测试角色。因此,我正在考虑如何进行RSpec等效。
车轮
起到可测量直径的作用。直径可测量的
被定义为响应
宽度的对象。到目前为止,我提出了两个不同的版本,使该对象可用于共享示例。哪种方法更好,还是有更好的方法

版本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 

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

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

顺便说一句,您的第二个版本为共享示例创建了一个新的
控制盘
,这可能会产生问题。

使用隐式主题似乎非常合适!这使得应用多个“it行为”更容易。