2010-11-03 67 views
0

我在一個名爲Project的模型中有此代碼。它在項目被保存之前將所有者設置爲項目。Rspec mock_model在instanced對象中不可用?

before_save :set_owner 

# Set the owner of the project right before it is saved. 
def set_owner 
    self.owner_id = mock_model(User).id # current_user.id is stubbed out for a mock_model. 
    # Lifecycle is set by the form's collection_select 
end 

而且CURRENT_USER功能在我的Rspec的測試返回mock_model掐滅(這就是爲什麼上面的代碼顯示mock_model代替CURRENT_USER)。

現在,當我運行此,我Rspec的測試突破,並且抱怨:

undefined method `mock_model' for #<Project:0x105c70af0> 

我的猜測是,由於before_save是一個實例函數,它在某種程度上認爲mock_model是在項目定義的函數。

以前有人遇到過這種情況...有什麼方法可以解決它嗎?

+0

除了我的評論:在我的控制器幫助我的方法不能在我before_save功能在我的模型中使用?即使我調用current_user時,它也會給我一個錯誤,說明中未定義的局部變量或函數current_user。該模型的範圍不包括我的應用程序控制器中的幫助器方法嗎? – hahuang65 2010-11-03 02:02:18

回答

2

兩件事情,立即站了出來:

  1. 你不應該在你的實際項目模型中使用mock_model。所有測試代碼應保留在規格中。

  2. 您無法將控制器中的current_user對象傳遞給模型(至少不應以任何方式)。

我會在您的項目模型中使用attr_accessor來設置current_user id。

class Project < AR::Base 
    attr_accessor :current_user 

    def set_owner 
    self.owner_id = current_user.id unless current_user.nil? 
    end 
end 

那麼你的天賦應該看的線沿線的東西更多:

it "should set the owner id" do 
    user = mock_model(User) 
    project = Project.new 
    project.current_user = user 
    project.save 
    project.owner_id.should == user.id 
end 
+0

我沒有在我的實際項目模型中使用mock_model。我只是寫在那裏以避免混淆(基本上這就是我的測試用ACTUAL代碼替代的)。 attr_accessor不允許我使用輔助方法。我的問題是,我將如何獲得實際的current_user? – hahuang65 2010-11-03 04:57:54

+0

我有點困惑,你想從哪裏獲得當前用戶?你原來的問題似乎是問你爲什麼你的項目模型中有一個未定義的方法mock_model。 – 2010-11-03 11:52:51

+0

對不起,我的問題一直不清楚。 current_user是我的應用程序控制器中定義的幫助函數。所以實際上有兩個問題。首先,我的before_save回調中不能訪問mock_model。第二個是current_user不能從我的模型中訪問。這兩個是通過current_user在我的測試中被剔除以調用mock_model的事實相關聯的。因此,如果我的測試中使用mock_model,current_user將無法在實現中工作。這是否更有意義? – hahuang65 2010-11-03 18:21:01