2014-06-25 37 views
22

başka bir birime dahil olan modül var ve ikisi de aynı yöntemi uygulamak. Ben, böyle bir şey dâhili modülün yöntemi saplama istiyorum:Rspec ile birlikte verilen bir modülün yöntemini yerleştirmenin bir yolu var mı?

module M 
    def foo 
    :M 
    end 
end 

module A 
    class << self 
    include M 

    def foo 
     super 
    end 
    end 
end 

describe "trying to stub the included method" do 
    before { allow(M).to receive(:foo).and_return(:bar) } 

    it "should be stubbed when calling M" do 
    expect(M.foo).to eq :bar 
    end 

    it "should be stubbed when calling A" do 
    expect(A.foo).to eq :bar 
    end 
end 

ilk test geçiyor, fakat ikinci bir çıkış:

Failure/Error: expect(A.foo).to eq :bar 

    expected: :bar 
     got: :M 

Neden saplama çalışma değil bu durumda? Bunu başarmanın farklı bir yolu var mı?

Teşekkürler!

------------------------------------- GÜNCELLEME -------- --------------------------

teşekkürler! allow_any_instance_of (M) kullanarak bunu çözdü. Bir sonraki sorum şu: - ben kullanmaya başladım ve dahil etmesem ne olur? sonsuz bir döngüde allow_any_instance_of (M) sonuçları kullanılarak,

module M 
    def foo 
    super 
    end 
end 

module A 
    class << self 
    prepend M 

    def foo 
     :A 
    end 
    end 
end 

describe "trying to stub the included method" do 
    before { allow_any_instance_of(M).to receive(:foo).and_return(:bar) } 

    it "should be stubbed when calling A" do 
    expect(A.foo).to eq :bar 
    end 
end 

Bu zaman: aşağıdaki kodu bakın. Neden? Doğrudan M.foo diyemezsin

cevap

23

Not! Kodunuz sadece :bar dönmek için M.foo alay çünkü çalışıyor gibi görünüyor. Eğer M dahil etmek A metaclass (class << self) açtığınızda

, o senin before bloğa ekliyor, M herhangi bir örneğini alay etmek zorunda:

allow_any_instance_of(M).to receive(:foo).and_return(:bar)

module M 
    def foo 
    :M 
    end 
end 

module A 
    class << self 
    include M 

    def foo 
     super 
    end 
    end 
end 

describe "trying to stub the included method" do 
    before do 
    allow(M).to receive(:foo).and_return(:bar) 
    allow_any_instance_of(M).to receive(:foo).and_return(:bar) 
    end 


    it "should be stubbed when calling M" do 
    expect(M.foo).to eq :bar 
    end 

    it "should be stubbed when calling A" do 
    expect(A.foo).to eq :bar 
    end 
end 
+0

Bu çalışır. Görünüşe göre, 'allow' seçeneğinin aksine allow_any_instance_of', nesne üzerinde tanımlanacak yöntemin kullanılmasını gerektirmiyor. –

+1

Sanırım bu sadece kafamı masaya çarparak 5 + saat değerinde çözmemde bana yardımcı oldu. Teşekkürler! – Derek

+2

Cf, 'expect_any_instance_of' ... Bu doğru yolda beni koy –

İlgili konular