2014-06-19 128 views
1

我在最後一篇文章(Undefined Method in rspec testing)上收到了一些很好的幫助,但我只是想尋求更多的幫助。訪問其他類的變量

我有一個rspec集成規範,我基本上需要更改代碼以獲得所需的結果。作爲練習的一部分,我無法改變規範。

let(:user) { User.new(voucher) } 

context 'no voucher' do 
    let(:voucher) { nil } 

    it 'should bill default price all the time' do 
     user.bill 
     expect(user.orders[0].billed_for).to eql 6.95 
     ... ... 
    end 
end 

context 'vouchers' do 
    describe 'default vouchers' do 
    let(:voucher) { Voucher.create(:default, credit: 15) } 

    it 'should not bill user if has a remaining credit' do 
     user.bill 
     expect(user.orders[0].billed_for).to eql 0.0 
     ... ... 
    end 
    end 

我放了一些小點只是爲了剪掉不必要的代碼。

我非常理解這裏發生了什麼。

正在創建一個新的用戶類並將其設置爲:let中的用戶。然後憑證根據具體情況啓動並傳入。第一次測試沒有設置優惠券。一個是第二個。

這裏就是我的問題開始

require 'order' 
require 'voucher' 

class User 
    attr_accessor :voucher, :orders 

    def initialize(orders = [], voucher = nil) 
    @voucher = voucher 
    @orders = [orders] 
    end 

    def bill 
    new_order = Order.new(self) 
    @orders << new_order 
    end 
end 

的方法initliased。它有可選的參數。我對初始化的工作原理有點不清楚,因爲我無法在任何地方訪問這些設置變量。

我有點不確定範圍的限制,但正如我希望訪問一些憑證變量從訂單類目前看起來像這樣

class Order 
    DEFAULT_PRICE = 6.95 

    attr_accessor :user 

    def initialize(user) 
    @user = user 
    end 

    def billed_for 
    price = DEFAULT_PRICE 
    user.orders.each do |order| 
     price - order.billed_for 
    end 
    price 
    end 
end 

shoudl訪問用戶憑證類是就像user.voucher一樣簡單。 ??

也是一個較小的問題。我目前正在使用工廠方法,所以憑證類可以自行初始化。

def self.create(type, *attrs) 

* attrs參數本質上是一個數組。我可以通過這個循環來檢查它們的存在並將它綁定到一些預期的變量。也就是說,如果數組有某個鍵,則將該鍵的值設置爲一個變量。這是最好的方式,還是有另一種流行的方式?

我知道這是很多要問,但我發現自己真的很困惑,並會很感激,如果annyone可以清除我的任何這些。謝謝。

回答

0

對於User類,因爲它們是實例變量和因attr_accessor頂部公開訪問您可以訪問voucherorders變量。

對於您的工廠問題,我建議FactoryGirl fromthoughbot它使建築物對象非常容易。您也可以使用Rails 燈具這是您創建的靜態數據。

+0

我只是有點不清楚我怎麼會在另一個類訪問這個。 user.voucher應該返回它的值是正確的?或者我錯過了一些東西 – user3750194

+0

如果用戶沒有優惠券,它將返回「優惠券」對象或「無」。您可以將'voucher'分配給一個變量,然後使用該變量訪問它的屬性。 – CWitty

0

原來我是以錯誤的順序初始化變量。這意味着我正在尋找錯誤類別的項目。

尷尬的noob錯誤!所有的更好:)