2017-12-01 16 views
5

मैं रुपये 5 के साथ रेल 5 का उपयोग कर रहा हूं। मैं अपनी रुपेक विधि में कक्षा कैसे बना सकता हूं? मैं वास्तव में लाइन में वर्ग "Coinbase :: वॉलेट" instantiating के बजाय निम्न वर्गमैं रुपये और रेल का उपयोग कर कक्षा कैसे बना सकता हूं?

require 'rails_helper' 

describe CryptoCurrencyService do 

    describe ".sell" do 

    it "basic_sell" do 
     last_buy_price = 3000 
     last_transaction = MoneyMakerTransaction.new({ 
     :transaction_type => "buy", 
     :amount_in_usd => "100", 
     :btc_price_in_usd => "#{last_buy_price}" 
     }) 
     @client = Coinbase::Wallet::Client.new(api_key: ENV['COINBASE_KEY'], api_secret: ENV['COINBASE_SECRET']) 
     sell_price = 4000 
     assert sell_price > last_buy_price * (1 + MoneyMakerThreshhold.find_buy.pct_change) 

     allow(@client).to receive(:sell_price).and_return({"base"=>"BTC", "currency"=>"USD", "amount"=>"#{sell_price}"}) 

     svc = CryptoCurrencyService.new 
     svc.sell(last_transaction) 
     last_transaction = MoneyMakerTransaction.find_latest_record 
     assert last_transaction.transaction_type, "sell" 
    end 

    end 

end 

है

@client = Coinbase::Wallet::Client.new(api_key: ENV['COINBASE_KEY'], api_secret: ENV['COINBASE_SECRET']) 

मैं नकली taht मैं तो मेरे सेवा वर्ग में सम्मिलित कर सकता है बनाना चाहते हैं, , जो मैं परीक्षण कर रहा हूँ। यह अभी खड़ा है के रूप में, जब मैं चीजों को चलाने के लिए, वास्तविक अंतर्निहित वर्ग instantiated है हो रही है, रन टाइम त्रुटि जिसके परिणामस्वरूप ...

1) CryptoCurrencyService.sell basic_sell 
    Failure/Error: payment_method = client.payment_methods()[0] 

    Coinbase::Wallet::AuthenticationError: 
     invalid api key 
+1

साथ Coinbase :: वॉलेट :: क्लाइंट के किसी भी मामले नकली सकता है आप हा 'rspec-mocks' पर डा नज़र है? https://github.com/rspec/rspec-mocks –

+1

हाँ, लेकिन मुझे ऐसी कोई चीज़ नहीं दिखाई दे रही है जो मेरी स्थिति के अनुरूप हो। – Dave

उत्तर

5

rspec मजाक उड़ाता है और स्टब्स किसी भी वर्ग पर इस्तेमाल किया जा सकता है। उदाहरण के लिए:

coinbase_mock = double(api_key: ENV['COINBASE_KEY'], api_secret: ENV['COINBASE_SECRET']) 
expect(Coinbase::Wallet::Client).to_receive(:new).and_return(coinbase_mock) 

तो आप जोड़ सकते हैं इतना है कि यह वर्ग आप की जरूरत की तरह नीम हकीमों coinbase_mock की तरह जो कुछ भी आप ... :)

2

आप इस्तेमाल कर सकते हैं एक रूबी इस तरह Struct:

Coinbase::Wallet::Client = Struct.new(:api_key, :api_secret) 
@client = Coinbase::Wallet::Client.new(ENV['COINBASE_KEY'], ENV['COINBASE_SECRET']) 
@client.api_key #=> whatever was in ENV['COINBASE_KEY'] 

फिर में उस वस्तु पारित

आप उस पर व्यवहार की जरूरत है तुम भी है कि इस तरह प्राप्त कर सकते हैं:।

Coinbase::Wallet::Client = Struct.new(:api_key, :api_secret) do 
    def client_info 
    ## logic here 
    "info" 
    end 
end 

@client = Coinbase::Wallet::Client.new(ENV['COINBASE_KEY'], ENV['COINBASE_SECRET']) 
@client.client_info #=> "info" 
1

पसंदीदा आरएसपीसी (ver के बाद से। 3) शैली

let(:coinbase_client) { instance_double(Coinbase::Wallet::Client) } 
# validates that mocked/stubbed methods present in class definitiion 

before do 
    allow(coinbase_client).to receive(:sell_price).and_return({"base"=>"BTC", "currency"=>"USD", "amount"=>"PRICE YOU PROVIDE"}) 
end 

docs about instance_double method

होगा, जबकि आप अपनी कक्षाओं कि वह आंतरिक रूप से उपयोग करने के लिए एक निर्माण पैरामीटर के रूप में coinbase_client इंजेक्षन

या अगर कुछ कारणों के लिए आप dependancy इंजेक्शन उपयोग नहीं कर सकते, तो आप

allow_any_instance_of(Coinbase::Wallet::Client).to receive(... *mock specific method*) 
संबंधित मुद्दे

 संबंधित मुद्दे