を使用するモデルがComparable
あり、これに必要な<=>
メソッドを実装しました。これをテストするにはどうすればよいですrspec
か (メソッドを既に実装しているので、TDD ではないことはわかっています)。
class Grade < ActiveRecord::Base
include Comparable
def <=>(other)
self.sort_key <=> other.sort_key
end
end
を使用するモデルがComparable
あり、これに必要な<=>
メソッドを実装しました。これをテストするにはどうすればよいですrspec
か (メソッドを既に実装しているので、TDD ではないことはわかっています)。
class Grade < ActiveRecord::Base
include Comparable
def <=>(other)
self.sort_key <=> other.sort_key
end
end
次のGrade
実装があるとします。
class Grade
attr_reader :sort_key
def initialize(sort_key)
@sort_key = sort_key
end
def <=>(other)
return nil unless other.respond_to?(:sort_key)
@sort_key <=> other.sort_key
end
end
のドキュメントに記載されGrade#<=>
ている内容に従って、適切に動作することをテストします。Object#<=>
# comparable_grade.spec
describe "Grade#<=>" do
it "returns 0 when both operands are equal" do
(Grade.new(0) <=> Grade.new(0)).should eq(0)
end
it "returns -1 when first operand is lesser than second" do
(Grade.new(0) <=> Grade.new(1)).should eq(-1)
end
it "returns 1 when first operand is greater than second" do
(Grade.new(1) <=> Grade.new(0)).should eq(1)
end
it "returns nil when operands can't be compared" do
(Grade.new(0) <=> Grade.new("foo")).should be(nil)
(Grade.new(0) <=> "foo").should be(nil)
(Grade.new(0) <=> nil).should be(nil)
end
it "can compare a Grade with anything that respond_to? :sort_key" do
other = double(sort_key: 0)
(Grade.new(0) <=> other).should eq(0)
end
end
スタブを使用してテストします。速くて簡単。
describe Grade do
context "<=>" do
before do
g1 = Grade.new
g2 = Grade.new
g3 = Grade.new
g1.stub(:sort_key=>1)
g2.stub(:sort_key=>2)
g3.stub(:sort_key=>1)
end
it "calls sort_key" do
Grade.any_instance.should_receive(:sort_key)
g1 < g2
end
it "works for comparing" do
expect{g1<g2}.to be_true
expect{g2>g1}.to be_true
expect{g1=g3}.to be_true
end
end
end