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
答案 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
,这可能会产生问题。