2011-04-03 47 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)