3

を使用するモデルがComparableあり、これに必要な<=>メソッドを実装しました。これをテストするにはどうすればよいですrspecか (メソッドを既に実装しているので、TDD ではないことはわかっています)。

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

2 に答える 2

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#<=>ている内容に従って、適切に動作することをテストします。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
于 2013-06-20T18:21:52.830 に答える
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
于 2013-06-20T18:05:58.213 に答える