2016-03-22 12 views
0

Ben üst sınıfsahte çocuk sınıfına

class StatsPeriod::Base 
    def merge(data) 
    to_range.inject({}) do |result, date| 
     result[date] = data[date] || 0 
     result 
    end.to_a 
    end 
end 

gelen yöntem ve bu çocuk sınıftaki tek mevcut yöntem to_range taklit nasıl Spec

require "rails_helper" 

describe StatsPeriod::Base do 
    let(:data) { { "20160604" => 1, "20160601" => 2 } } 
    let(:range_data) do 
    [ 
     "20160528", 
     "20160529", 
     "20160530", 
     "20160531", 
     "20160601", 
     "20160602", 
     "20160603", 
     "20160604" 
    ] 
    end 

    describe "#merge" do 
    let(:stats) do 
     [ 
     ["20160528", 0], 
     ["20160529", 0], 
     ["20160530", 0], 
     ["20160531", 0], 
     ["20160601", 2], 
     ["20160602", 0], 
     ["20160603", 0], 
     ["20160604", 1] 
     ] 
    end 

    it "returns hash with stats" do 
     expect(described_class.new.merge(data)).to eq(stats) 
    end 
    end 
end 

ve range_data ya da belki ben döndüren çocuk sınıfıyla alay etmeli ve ChildClass.merge (veri) gibi bir şey beklemeli ama

cevap

0

Sadece bu değil mi? Eğer, sadece sınıf açmak ve test uğruna yönteminin uygulamasını ekleyebilirsiniz isterseniz

it "returns hash with stats" do 
     fred=described_class.new 
     allow(fred).to receive(:to_range) { range_data} 
     expect(.merge(data)).to eq(stats) 
    end 
+0

# uygulanmadı: to_range –

0

Yakut + maymun yama = :)

kazanmak. Küresel kapsamını önlemek için, muhtemelen en iyi sen kapsam içine maymun yama getirmek için spec içindeki

using M 

çağırabilir refinements sonra http://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html

module M 
    refine StatsPeriod::Base do 
    def to_range 
     ... 
    end 
    end 
end 

kullanılır?