Rspec тест сопоставимый
У меня есть модель, которая использует Comparable
, и я реализовал требуемый Метод <=>
для этого. Как я должен пройти тестирование этого w/ rspec
(я знаю, что это не TDD, так как я уже реализовал метод)?
class Grade < ActiveRecord::Base
include Comparable
def <=>(other)
self.sort_key <=> other.sort_key
end
end
2 ответа:
Учитывая следующую реализацию
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