2011-04-03 53 views
6

這應該很簡單,但我無法讓它工作。我想存根的:Stub模型在Rspec/Rails中的保存方法

@alliance.save 

,使其返回true。我試過了:

Alliance.stub(:save).and_return(true) 

但它不起作用。有任何想法嗎 ?

回答

14

如果我沒有弄錯,Alliance.stub(:save)會影響對Alliance.save的呼叫。你想要@alliance.stub(:save).and_return(true)

Mocha有一個有用的方法any_instance,所以你可以做這樣的事情Alliance.any_instance.stubs(:save).returns(true),這將(顧名思義)存根save方法的Alliance任何實例。

+0

嗯,其實我覺得這是相同的,因爲保存是一個實例方法。無論如何,我無法真正訪問@alliance,因爲它像標準創建方法中的「@alliance = Alliance.new(params [:alliance])」。我只是想繞過保存驗證,因爲我似乎無法通過「:post:create,:name =>'whatever'來傳遞post變量」 – Spyros 2011-04-03 23:40:42

+0

提到您想要將方法存根創建的實例變量在控制器中可能會幫助您獲得更準確的響應。 ;) – 2011-04-03 23:45:03

+0

但我提到:) – Spyros 2011-04-03 23:46:02

4

你可能尋找類似:

describe AllianceController do 
    let(:alliance) { mock_model(Alliance) } 

    describe "#<controller action>" do 
    before do 
     Alliance.stub :new => alliance 
    end 

    context "valid alliance" do 
     before do 
     alliance.stub :save => true 
     end 

     it "should ..." do 

     end 
    end 
    end 
end 

內上下文允許你將與聯盟模擬它具有保存方法存根返回true工作。

+0

+1在從SpyrosP的評論中獲得更多詳細信息後,我認爲這可能是測試控制器的最佳方法(即使他們的參數工作正常)。 – 2011-04-04 03:32:16

6

使用新RSpec的語法:

allow_any_instance_of(Alliance).to receive(:save).and_return(true)