2013-06-20 6 views
3

У меня есть модель, которая использует Comparable, и я применил для этого необходимый метод <=>. Как мне пойти на тестирование этого w/rspec (я знаю, что это не TDD, поскольку я уже реализовал этот метод)?Rspec test Сопоставимый <=>

class Grade < ActiveRecord::Base 
    include Comparable 
    def <=>(other) 
    self.sort_key <=> other.sort_key 
    end 
end 
+0

Я бы не бить чтобы написать такой тривиальный метод, прежде чем писать свои тесты. Важно иметь тесты, не обязательно, как вы пришли к ним. – tadman

+0

Даже если это тривиально, мне все равно хотелось бы посмотреть, как люди будут тестировать его, поскольку я новичок, когда дело доходит до тестирования. –

+1

Я имею в виду, что вы написали метод, это не имеет большого значения, в отличие, скажем, написания большого приложения и * затем * попытки писать тесты. – tadman

ответ

3

Учитывая следующие 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#<=> ведет себя должным образом, согласно тому, что documentation для 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 
2

Использовать заглушку для проверки. Быстро и легко.

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