2012-07-19 64 views
0

在我SubscriptionsController我:如何在rails和rspec中模拟链接关联?

# DELETE /subscription # {{{ 
    def destroy 
    @subscription = current_user.subscriptions.find params[:id] 
    @subscription.cancel! 
    redirect_to subscriptions_path, :notice => "Abonnement beendet." 
    end# }}} 

什么是模拟出在我的控制器,规格current_user.subscriptions.find params[:id]正确的方法是什么?

目前我正在尝试在我之前的块。

double(Subscription) 
    controller.current_user.stub!(:subscriptions).and_return(Subscription) 
    Subscription.stub!(:find).and_return(subscription) 

但这看起来不像预期的那样工作,因为我的RSpec-Expectations不起作用。

it "updates the status to canceled" do 
    sub = Subscription.stub!(:find).and_return(subscription) 
    sub.stub!(:cancel!) 
    sub.should_receive :cancel! 
    delete :destroy, :id => 1 
end 

这一块总是失败的因为...期望should_receive不满足:

1) SubscriptionsController DELETE /subscription/:id updates the status to canceled 
    Failure/Error: sub.should_receive :cancel! 
    (#<Proc:[email protected]/Users/nilsriedemann/.rvm/gems/[email protected]/gems/rspec-mocks-2.6.0/lib/rspec/mocks/message_expectation.rb:63 (lambda)>).cancel!(any args) 
    expected: 1 time 
    received: 0 times 
    # ./spec/controllers/subscriptions_controller_spec.rb:38:in 
    # `block (3 levels) in <top (required)>' 
    # ' 

此外,如果有人滴不错链接到有关磕碰透彻的文章,在评论嘲讽,我会很高兴的离谱。仍然(显然)没有得到这一点。

回答

4

您正在设置订阅上的should_receive,而不是find将返回的对象。

喜欢的东西

Subscription.stub!(:find).and_return(subscription) 
subscription.should_receive :cancel! 

是你所追求的。

您可能也有兴趣stub_chain

some_user.stub_chain(:subscriptions, :find => some_result) 

套东西,这样

some_user.subscriptions.find 

回报some_result

+0

这对我来说非常合适,所以谢谢!我也尝试一下存根链的几个属性,但它不起作用。你必须为每个属性声明一个单独的'#stub_chain'。这对某些人来说可能是显而易见的,但它让我绊了一会儿,所以我想我会分享。 – 2013-09-06 15:30:43

1

有几种方法可以做到这一点。如果你想要一个简单的解决方案,你可以使用stub_chain并把它传递尽可能多的方法,只要你想:

let(:subscription) { mock(:subscription) } 
current_user.stub_chain(:subscriptions, :find) { subscription } 

而另一个将是不能直接使用的活动记录,并且对用户模型查找方法:

let(:subscription) { mock(:subscription) } 
current_user.stub(:find_subscription) { subscription } 

这真的是一个意见的问题,归结为任何你感到最舒服的。我个人会选择一个。