Rspec测试公共控制器方法将params传递给私有控制器方法

时间:2015-06-18 18:33:09

标签: ruby-on-rails ruby-on-rails-4 rspec controller rspec-rails

这是我的控制者:

class PlansController

  def use_new_card
    @user = User.find_by_id(new_card_params[:user_id])
    if new_stripe_card
    ...
  end

  private

  def new_card_params
    params.permit(:user_id, :stripeToken)
  end

  def new_stripe_card
    StripeService.new({user_id: @user.id, customer_id: @user.stripe_customer_id, source: new_card_params[:stripeToken]}).new_card
  end
end

我试图编写一个控制器规范来测试当POST方法的use_new_card正确参数时{}} new_stripe_card {{1}适当地获取这些参数。

到目前为止,我的规范看起来像这样:

StripeService.new

但随着我的到来

describe "when proper params are passed" do
  before do
    @user = User.create(...)
  end

  it "should allow StripeService.new to receive proper parameters" do
    StripeService.should_receive(:new).with({user_id: @user.id, customer_id: @user.stripe_customer_id, source: "test"})
    post :use_new_card, user_id: @user.id, stripeToken: "test"
  end
end

完全公平,但我不确定如何解决这个问题...我不能只是存根Failure/Error: post :use_new_card, user_id: @user.id, stripeToken: "test" NoMethodError: undefined method `new_card' for nil:NilClass ,因为new_card对象上的存根方法仍会抛出这个错误(我尝试将nil添加到StripeService.any_instance.stub(:new_card).and_return(true)块中)

1 个答案:

答案 0 :(得分:1)

默认情况下,存根方法返回nil。使用and_return指定stub ::

返回的值
StripeService.should_receive(:new).and_return(whatever)

或使用较新的语法

expect(StripeService).to receive(:new).and_return(whatever)

修改

请原谅我挥手。您的存根必须返回一个对象,该对象将作为StripeService的实例,以达到测试目的所需的范围。例如:

let(:new_card) { double }
let(:new_stripe_service) { double(new_card: new_card) }
...
expect(StripeService).to receive(:new).and_return(new_stripe_service)

现在,当测试引用new_stripe_service时,RSpec将返回一个测试双精度,其中有一个名为#new_card的方法存根,它本身就是一个双精度数。您可以添加进行测试通过所需的任何其他存根。或者,您可以为StripeService返回new_stripe_service的实际实例。