2014-04-18 10 views
7

Çok araştırdım ve basit görünmesine rağmen bunu anlayamıyorum. İşte yapmak istediğim şeyin basitleştirilmiş bir örneği. Merhaba" örneğin "veda" olarak, ben farklı bir parametre geçmesi gerekiyorRspec 3.0 Parametreyi değiştiren ancak dönüş değeri olmayan bir yöntem nasıl yapılır?

class Test 
    def test_method(param) 
    puts param 
    end 
    test_method("hello") 
end 

Ama RSpec testinde yerine:

şey yapar ama gibi bir şey döndürmeyen basit bir yöntem oluşturun ." Bu kütüklerden ve mocks ile ilgisi var biliyorum ve belgelere bakarak ettik ama onu anlamaya olamaz: https://relishapp.com/rspec/rspec-mocks/v/3-0/docs/method-stubs

Yaparsam: Bir saplama için söylüyor

@test = Test.new 
allow(@test).to_receive(:test_method).with("goodbye") 

varsayılan değer ancak doğru şekilde nasıl yapılacağını anlayamıyorum.

Hata mesajı:

@test.stub(:test_method) 

gibi

received :test_method with unexpected arguments 
    expected: ("hello") 
    got: ("goodbye") 
Please stub a default value first if message might be received with other args as well.  

ben RSpec 3.0 kullanarak ve arıyorum şey izin verilmez. senin Örneğin

+0

Hata iletiniz, saplamanızın tersi görünüyor. –

cevap

1

, sen puts o param geçen denilen alır sadece, test_method fiili sonucunu test etmek gerekmez çünkü ben yöntemi beklenti kurma ve çalıştırarak sadece deneme olur:

Eğer yöntem üzerinde bir test spy kurulduğundan yapmaya çalışıyorsanız, ama sonra sen puts çağrısına yerine yöntemi saplama bir seviyesi çok yüksek (kendisi test_method üzerine kuruyoruz düşünüyorum görünüyor ne
class Test 
    def test_method(param) 
    puts param 
    end 
end 

describe Test do 
    let(:test) { Test.new } 

    it 'says hello via expectation' do 
    expect(test).to receive(:puts).with('hello') 
    test.test_method('hello') 
    end 

    it 'says goodbye via expectation' do 
    expect(test).to receive(:puts).with('goodbye') 
    test.test_method('goodbye') 
    end 
end 

test_method içinde). Eğer puts için çağrı saplama koyarsanız, testlerin bir geçmelidir:

describe Test do 
    let(:test) { Test.new } 

    it 'says hello using a test spy' do 
    allow(test).to receive(:puts).with('hello') 
    test.test_method('hello') 
    expect(test).to have_received(:puts).with('hello') 
    end 

    it 'says goodbye using a test spy' do 
    allow(test).to receive(:puts).with('goodbye') 
    test.test_method('goodbye') 
    expect(test).to have_received(:puts).with('goodbye') 
    end 
end 
+1

Teşekkürler - bu yardımcı olur! Birincisi, bunu beklemediğini (test) .bilmediğini (: koyar) ”diyemedim - sadece düz yöntemi ('test_method' burada) arayabileceğinizi düşündüm, bu yüzden bunu bilmek güzel. Sonunda benim asıl problemim daha karmaşıktı ve kodumu değiştirmem gerektiğine karar verdim: * bir değeri döndüren * yöntemi, muhtemelen daha iyi bir uygulama. Ve sonra '(test_method) .and_return (' hoşçakal ') 'almak için izin (test). Eminim bunun bir kısmını kullanmanın başka bir yolu olduğuna eminim, ayrıca test casusları hakkında da bilgi sahibi olmak iyidir - daha önce hiç rastlamadım. – user3060126

4

nasıl geldi nereye

and_call_original can configure a default response that can be overriden for specific args

require 'calculator' 

RSpec.describe "and_call_original" do 
    it "can be overriden for specific arguments using #with" do 
    allow(Calculator).to receive(:add).and_call_original 
    allow(Calculator).to receive(:add).with(2, 3).and_return(-5) 

    expect(Calculator.add(2, 2)).to eq(4) 
    expect(Calculator.add(2, 3)).to eq(-5) 
    end 
end 

Kaynak açıklanmıştır bir varsayılan değere ayarlamak için Bu konu hakkında bilgi edinmek için: https://makandracards.com/makandra/30543-rspec-only-stub-a-method-when-a-particular-argument-is-passed

İlgili konular